2017-01-05 11 views
10

तो मैं विशिष्ट से शुरू सभी फाइलों को निर्यात करना चाहते हैं आज तक आईडी प्रतिबद्ध (जो बाद में प्रतिबद्ध शामिल हो सकते हैं) के लिए प्रतिबद्ध है, इसलिए मैं यह कर रहा हूं:Git निर्यात फ़ाइलों आज तक

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commitId | xargs tar -rf output.tar

हालांकि, ऐसा लगता है कि यह केवल आउटपुट फ़ाइल है जो निर्दिष्ट प्रतिबद्ध आईडी ($commitId) में संशोधित किया गया था।

जो मैं खोज रहा हूं वह यह है कि इसे आज तक निर्दिष्ट प्रतिबद्ध आईडी से शुरू होने वाली सभी फाइलों को निर्यात करना चाहिए (उस समय के दौरान होने वाली किसी अन्य प्रतिबद्धता सहित)।

+1

क्या आप अधिक जानकारी में निर्दिष्ट कर सकते हैं कि आप क्या चाहते हैं? क्या आप विशिष्ट * प्रतिबद्धता के बाद * * सभी संस्करण * * * सभी फ़ाइलों * * * (*) * * के सभी संस्करण * में * * * सभी फ़ाइलों * के संग्रह (1) * (3) * (*) के वर्तमान संस्करण * विशिष्ट प्रतिबद्धता (जो सभी फाइलें नहीं हो सकती हैं) के बाद विशिष्ट प्रतिबद्धता (जो सभी फाइलें नहीं हो सकती हैं), या (4) * फ़ाइलों के सभी संस्करण * * के बाद * बदली गई * हैं। – mkrieger1

+0

आप ['गिट बंडल'] (https://git-scm.com/docs/git-bundle) या [' git archive'] का उपयोग करना चाह सकते हैं (https://git-scm.com/docs/git -पुरालेख)। – mkrieger1

उत्तर

3

Git documentation से हवाला देते हुए:

Git diff पेड़ - दो पेड़ के माध्यम से पाया सामग्री और धब्बे के मोड वस्तुओं

...

तो तुलना वहाँ केवल एक दिया गया है, प्रतिबद्धता की तुलना उसके माता-पिता से की जाती है (नीचे देखें - नीचे देखें)।

आपके मामले में आप केवल एक <tree-ish> तो यह $commitId के माता पिता के साथ तुलना दे रहे हैं। इसके बजाय आपको दो <tree-ish> ईएस के बीच की तुलना के लिए प्रदान करना चाहिए।

मान लीजिए कि काम मास्टर शाखा पर है और मास्टर शाखा पूरी तरह से अद्यतित है; तो निम्न आदेश तुम क्या चाहते देना चाहिए:

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT ${commitId}~1 master | xargs tar -rf output.tar 

~1${commitId} के बाद इतनी ${commitId} के माता-पिता की तुलना सापेक्ष बनाना होता है, वरना ${commitId} में परिवर्तन नहीं गिना जाता था।

5
git diff -z --name-only --diff-filter ACMRT ${commitId}~ HEAD | xargs -0 tar -rf output.tar 
  1. git diff पर्याप्त है; प्रतिबद्ध श्रेणी में परिवर्तित फ़ाइल नामों की सूची खोजने के लिए आपको git diff-tree का उपयोग करने की आवश्यकता नहीं है।
  2. xargs में git diff और -0 में -z विकल्प अन्यथा रिक्त स्थान के साथ किसी भी पथ/फ़ाइल नाम अपने आदेश को तोड़ने के लिए कारण होगा, NUL उत्पादन क्षेत्र टर्मिनेटर्स का उपयोग सुनिश्चित करता है।
  3. ${commitId}~ HEAD${commitId} (इसलिए उस प्रतिबद्धता में परिवर्तन शामिल हैं) के मूल प्रतिबद्धता के बीच परिवर्तन सूचीबद्ध करता है, और सबसे हालिया प्रतिबद्धता (HEAD)।
+0

यह आपका समाधान है। मैं इसके बजाय $ {commitId} ~ 1 का उपयोग करूंगा, क्योंकि मुझे यह स्पष्ट लगता है, लेकिन यह वही बात है। इस समाधान के बारे में अच्छी बात यह भी है कि अगर किसी भी फाइल को संशोधित किया गया था और फिर वापस संशोधित किया गया (बाद में प्रतिबद्धता में पूर्ववत संपादन), तो उन्हें अंतिम टैर से छोड़ा जाएगा! :-) –

संबंधित मुद्दे