2011-04-09 8 views
105

मैं सिर्फ दो संशोधनों को जिन्हें सरल है के बीच बदली हुई फ़ाइलों की एक सूची प्राप्त करना चाहते हैं:Git diff --name-केवल और कॉपी उस सूची

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

लेकिन, मैं क्या लिखना चाहिए, अगर मैं कॉपी चाहते हैं सभी सूचीबद्ध फाइलें किसी अन्य स्थान पर? और मुझे प्रतिलिपि बनाई गई फ़ाइलों के लिए पूरी तरह से समान निर्देशिका संरचना की आवश्यकता है।

उदाहरण के लिए, मैं संशोधित और जोड़ लिया है फ़ाइलें:

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

मैं काफी समझ में नहीं आता कि आप क्या हासिल करने की कोशिश कर रहे हैं ... के लिए प्रचार परिवर्तन विभिन्न क्लोन? पैच बनाना? एक गिट भंडार के बाहर फ़ाइलों को पैचिंग? – knittl

+0

पैच नहीं, लेकिन बदली गई फ़ाइलों की सटीक प्रति संरचना। पैच की तरह, लेकिन ठोस फाइलों के साथ – BazZy

+0

और हाँ, गिट भंडार के बाहर फ़ाइलों को पैच करना - मेरे लिए निकटतम लक्ष्य :) – BazZy

उत्तर

86

निम्न आदेश है, जो मैं परीक्षण किया है का प्रयास करें:

सूची बदल फ़ाइलें & के रूप में उन्हें पैक:

$ cp -pv --parents `git diff --name-only` DESTINATION-DIRECTORY 
+1

'cp --parents'' संकेत के लिए धन्यवाद, मैं उस विकल्प को सालों से चाहता था और कभी नहीं जानता था कि यह अस्तित्व में है! .. जाहिर है, मैंने इसे देखने के लिए कभी भी परेशान नहीं किया है = \ –

+1

ध्यान दें कि यह मैक पर काम नहीं करता है, क्योंकि 'cp' के '--parents' विकल्प उपलब्ध नहीं है। –

+0

फाइलों के असामान्य वर्ण होने पर इसका उपयोग करने पर कोई सुझाव? व्हाइटस्पेस, नॉर्डिक पात्र। –

9

निम्नलिखित ठीक काम करना चाहिए:

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

मैं उन सब बदल गया और कहा कि फ़ाइलों /home/changes/ में करना चाहते हैं

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

आगे की व्याख्या करने के लिए:

  • -zgit diff --name-only साथ करने के लिए उत्पादन के लिए NUL साथ अलग फ़ाइलों की सूची का अर्थ है नई-पंक्तियों के बजाय बाइट्स, अगर आपके फ़ाइलनामों उन में असामान्य वर्ण की है।

  • -0 से xargs पैरामीटर की एनयूएल से अलग सूची के रूप में मानक इनपुट की व्याख्या करने के लिए कहते हैं।

  • -IREPLACE डिफ़ॉल्ट xargs द्वारा के बाद से की जरूरत है rsync आदेश के अंत में पैरामीटर संलग्न करेंगे। इसके बजाए, उनको कहने के लिए कहा जाता है कि बाद में REPLACE है। (यह this Server Fault answer से एक अच्छा टिप है।)

  • rsync को -a पैरामीटर अनुमतियाँ, स्वामित्व, आदि यदि संभव हो तो संरक्षित करने के लिए इसका मतलब है। -R गंतव्य में फ़ाइलों को बनाते समय पूर्ण सापेक्ष पथ का उपयोग करना है।

अद्यतन: आप xargs के एक पुराने संस्करण है, तो आप -I के बजाय -i विकल्प का उपयोग करने की आवश्यकता होगी। (पूर्व findutils के बाद के संस्करणों में मान्य नहीं है।)

+0

मुझे त्रुटि मिली है : xargs: अमान्य विकल्प - I – BazZy

+0

यह अजीब बात है - आप किस ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं? यदि यह एक लिनक्स वितरण है, तो कौन सा, और 'xargs --version' क्या कहता है? –

+0

जीएनयू xargs संस्करण 4.1 – BazZy

5

यहाँ एक एक लाइनर है * .zip:

git diff --name-only | zip patched.zip [email protected] 

सूची पिछले * प्रतिबद्ध बदली हुई फाइलों & के रूप में उन्हें पैक।जिप:

git diff --name-only HEAD~ HEAD | zip patched.zip [email protected] 
+0

यदि आप विंडोज़ का उपयोग कर रहे हैं तो आप https://sourceforge.net/projects/gnuwin32/files/zip/ से कमांडलाइन ज़िप डाउनलोड कर सकते हैं – Radon8472

3
zip update.zip $(git diff --name-only commit commit) 
1

यह पूरी तरह से काम करता है।

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

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

कोई एक cpio जो टाइप करने के लिए आसान है उल्लेख किया है, हार्ड लिंक बनाता है और फ़ाइल नाम में रिक्त स्थान संभालता है:

git diff --name-only $from..$to | cpio -pld outdir 
संबंधित मुद्दे