গিট ডিফ - শুধুমাত্র নাম এবং সেই তালিকাটি অনুলিপি করুন


151

আমি কেবল দুটি সংশোধনীর মধ্যে পরিবর্তিত ফাইলের একটি তালিকা পেতে চাই, যা সহজ:

git diff -–name-only commit1 commit2 > /path/to/my/file

তবে, আমি কী লিখব, যদি আমি তালিকাভুক্ত সমস্ত ফাইল অন্য জায়গায় অনুলিপি করতে চান? এবং অনুলিপি করা ফাইলগুলির জন্য আমার সম্পূর্ণ অভিন্ন ডিরেক্টরি কাঠামো দরকার।

উদাহরণস্বরূপ, আমি ফাইলগুলি সংশোধন ও সংযোজন করেছি:

/protected/texts/file1.txt
/protected/scripts/index.php
/public/pics/pic1.png

আমি এই /home/changes/সমস্ত পরিবর্তিত এবং যুক্ত ফাইলগুলিতে থাকতে চাই:

/home/changes/protected/texts/file1.txt
/home/changes/protected/scripts/index.php
/home/changes/public/pics/pic1.png

1
আপনি কী অর্জন করতে চাইছেন তা আমি পুরোপুরি বুঝতে পারি না ... বিভিন্ন ক্লোনগুলির পরিবর্তনের প্রচার করছে? প্যাচ তৈরি? গিট সংগ্রহস্থলের বাইরে ফাইলগুলি প্যাচিং করছেন?
নিটল

প্যাচ নয়, পরিবর্তিত ফাইলগুলির সঠিক কপির কাঠামো। প্যাচের মতো, তবে কঠিন ফাইল সহ
বাজজি

এবং হ্যাঁ, গিট সংগ্রহস্থলের বাইরে ফাইলগুলি প্যাচিং করা - আমার নিকটতম লক্ষ্য :)
বাজজি

3
দুঃখিত। কি? আপনি ফাইল এবং গাছের পরিবর্তনের পরিবর্তনগুলি ক্যাপচার এবং পুনরায় খেলতে চান? এটি একটি প্যাচ। git format-patchকমিট রেঞ্জের জন্য এটি করতে পারে।
নিটল

1
git diff commit1 commit2 > my.patchএবং তারপর cd other/path; patch -p1 < my.patch। এটি ফাইলগুলির সম্পূর্ণ অনুলিপি সহ কেন করতে হবে? যদি আপনি মনে করেন যে প্যাচটি প্রয়োগ নাও হতে পারে, এবং তাই অন্য ডিরেক্টরিটি সত্যই commit1রাজ্যে নেই, আপনার অবশ্যই রাষ্ট্র থেকে সমস্ত কিছু অনুলিপি করা উচিত commit2...
ক্যাসাবেল

উত্তর:


118

নিম্নলিখিত কমান্ডটি চেষ্টা করুন, যা আমি পরীক্ষা করেছি:

$ cp -pv --parents $(git diff --name-only) DESTINATION-DIRECTORY

2
cp --parentsইঙ্গিতটির জন্য ধন্যবাদ , আমি বছরের পর বছর ধরে সেই বিকল্পটি চেয়েছিলাম এবং কখনই জানত না যে এটি বিদ্যমান আছে! .. অবশ্যই স্পষ্টভাবে আমি কখনই এটির জন্য অনুসন্ধান করতে বিরত হইনি = \
স্টিফান হেনিংসেন

2
নোট করুন যে এটি ম্যাকের জন্য কাজ করে না, কারণ --parentsবিকল্পটি cpউপলভ্য নয়।
এম জাস্টিন

ফাইলগুলিতে অস্বাভাবিক অক্ষর থাকলে এটি ব্যবহারের কোনও পরামর্শ? হোয়াইটস্পেস, নর্ডিক অক্ষর।
হালভার হোলস্টেন স্ট্র্যান্ড

@ হাভরস্ট্রান্ড, আমি এটি পরীক্ষা করি নি তবে IFS=$'\n'প্রথমে সেট করা এটি করতে পারে। (অগ্রাধিকার হিসাবে একটি সাব-শেলের মধ্যে যাতে আপনার মূল আইএফএসের মানটি
ওয়াইল্ডকার্ড

আমি cp: cannot stat 'git diff --name-only': No such file or directoryউইন্ডোতে গিট ব্যাশে ত্রুটি পাচ্ছি । আমি কি ভুল করছি? গন্তব্য-ডিরেক্টরি বিদ্যমান
শিব

14

নিম্নলিখিতটি ভাল কাজ করা উচিত:

git diff -z --name-only commit1 commit2 | xargs -0 -IREPLACE rsync -aR REPLACE /home/changes/protected/

আরও ব্যাখ্যা করতে:

  • -zসঙ্গে git diff --name-onlyআউটপুট মানে NUL দিয়ে পৃথক ফাইলের তালিকা নতুন লাইন পরিবর্তে বাইট, শুধু ক্ষেত্রে আপনার ফাইলের নামের তাদের মধ্যে অস্বাভাবিক অক্ষর বাকি আছে।

  • -0থেকে xargsপরামিতি একটি NUL বিভাজিত তালিকা হিসাবে স্ট্যান্ডার্ড ইনপুট ব্যাখ্যা করা বলছেন।

  • -IREPLACEপ্রয়োজন হয় ডিফল্টরূপে যেহেতু xargsশেষে পরামিতি যোগ হবে rsyncকমান্ড। পরিবর্তে, এটি তাদের পরে রাখার REPLACEজন্য বলে। ( এই সার্ভার ফল্ট উত্তর থেকে এটি একটি দুর্দান্ত পরামর্শ ))

  • -aথেকে প্যারামিটার rsyncমানে অনুমতি, মালিকানা, ইত্যাদি সম্ভব হলে সংরক্ষণ করা। -Rযখন গন্তব্য ফাইল তৈরি মানে পূর্ণ আপেক্ষিক পাথ ব্যবহার করতে।

আপডেট: আপনার যদি একটি পুরানো সংস্করণ থাকে তবে আপনার পরিবর্তে বিকল্পটি xargsব্যবহার করতে -iহবে -I। (পূর্ববর্তী সংস্করণগুলিতে পূর্বেরটিকে অবহেলা করা হয়েছে findutils))


এটি আজব - আপনি কোন অপারেটিং সিস্টেমটি ব্যবহার করছেন? যদি এটি লিনাক্স বিতরণ হয়, কোনটি এবং কী xargs --versionবলে?
লংগায়ার

1
আহ, এর -iপরিবর্তে xargs এর সংস্করণটিতে আপনার ব্যবহার করা দরকার যা পরবর্তী সংস্করণগুলিতে অবমূল্যায়ন করা হয়েছে - ৪.১ এখন বেশ পুরানো। আমি আমার উত্তর আপডেট করব।
লংগায়েরকে

@ মার্ক: আমি কোথাও পড়ে মনে পড়েছি যে -Iকয়েকটি সংস্করণে আপনার প্রয়োজন পরে একটি স্থান প্রয়োজন , তাই সম্ভবত -I REPLACEপরিবর্তে চেষ্টা করুন।
মাইকেল

কিছু মনে করো না. এটিও কাজ করে না। -Iযেহেতু শুধুমাত্র সমর্থিত findutils4.2.10 মুক্তি ডিসেম্বর 2004
Mikel

--diff-filter=dতালিকা থেকে মুছে ফেলা ফাইলগুলি বাদ দিতে আপনার যুক্ত করা উচিত । অন্যথায় পরিবর্তনগুলি ফোল্ডারে অনুলিপি করার সময় আপনি ত্রুটিগুলি শেষ করবেন। অন্যথায় দুর্দান্ত উত্তর। ধন্যবাদ!
নির্বিঘ্নে

11

এখানে একটি ওয়ান-লাইনার:

পরিবর্তিত ফাইলগুলির তালিকা করুন এবং এগুলিকে *। জিপ হিসাবে প্যাক করুন:

git diff --name-only | zip patched.zip -@

সর্বশেষ প্রতিশ্রুতিবদ্ধ পরিবর্তিত ফাইলগুলির তালিকা করুন এবং এগুলিকে *। জিপ হিসাবে প্যাক করুন:

git diff --name-only HEAD~ HEAD | zip patched.zip -@

আপনি Windows ব্যবহার করেন তাহলে আপনার কাছ থেকে কমান্ড জিপ ডাউনলোড করতে পারেন sourceforge.net/projects/gnuwin32/files/zip
Radon8472

@ Radon8472 ইনস্টল sed.exe? আমি এখনও zipউইন্ডোজ পাওয়া যায় না।
শিব

না, লিঙ্কটি zip.exe এর জন্য ডাউনলোডের দিকে ইঙ্গিত করছে না সেডের জন্য। আপনি যদি কমান্ডলাইনে জিপটি ব্যবহার করতে না পারেন তবে আপনার এনভেরি PATHভেরিয়েবলে zip.exe ইনস্টল করা ফোল্ডারটি যুক্ত করা উচিত ।
Radon8472



2

এটি পুরোপুরি কাজ করে।

git diff 1526043 82a4f7d --name-only | xargs zip update.zip

git diff 1526043 82a4f7d --name-only |xargs -n 10 zip update.zip

1

cpioকোনটি উল্লেখ করা যায়নি যে কোনটি টাইপ করা সহজ, হার্ড লিঙ্কগুলি তৈরি করে এবং ফাইলের নামগুলিতে স্পেস পরিচালনা করে:

git diff --name-only $from..$to  | cpio -pld outdir
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.