2010-09-08 13 views
10

अद्यतन: मैंने अपने विकल्पों की स्पष्ट व्याख्या प्राप्त करने के लिए यहां वास्तविक उदाहरण को सरल बनाने की कोशिश की, लेकिन यह वास्तव में काम नहीं करता था। अभी तक नीचे दिए गए लिंक किए गए उदाहरण काम करने के लिए इस सरल उदाहरण को पाने के लिए बहुत सामान्य हैं।गिट से इतिहास का सबसेट निकालने के लिए कैसे?

मैं हर समय एसवीएन के साथ इस तरह की चीज करने में सक्षम था और इसमें काफी कुशलता प्राप्त हुई। अब मुझे गिट में यह बेहद मुश्किल लगता है और यह मानना ​​शुरू हो रहा है कि मेरा इतिहास मूल रूप से इसे अलग करने में सक्षम होने के लिए भी एक साथ उलझा हुआ है।

असली दुनिया की समस्या: मैं लगभग एक दर्जन फाइलों को स्थानांतरित कर चुका हूं और उनका नाम बदला गया है। उनका इतिहास सैकड़ों अन्य फ़ाइलों के इतिहास से जुड़ा हुआ है जिसके लिए मैं इतिहास को पूरी तरह से हटाना चाहता हूं।

एसवीएन में, मैं डंप/शामिल-फ़िल्टर/बहिष्कार-फ़िल्टर/लोड का अनुक्रम का उपयोग करने के लिए रिपोजिटरी को ट्रिम करने के लिए उपयोग कर पाऊंगा और शायद ही कभी मुझे लोड होने से पहले डंप फ़ाइल में मैन्युअल रूप से पथों का नाम बदलने की आवश्यकता हो सकती है।

कुछ इस तरह है और मैं किया गया है जाएगा:

SET Includes=trunk/src/Foo.aaa trunk/src/Foo.bbb trunk/src/Foo trunk/src/Bar 
SET Excludes=trunk/src/Bar/Blah.aaa trunk/src/Foo/Blah.aaa 

svnadmin dump FooSrc > Full.dump 2> Dump.log 
svndumpfilter include %Includes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs <Full.dump> Filter_1.dump 2> Filter_1.log 
svndumpfilter exclude %Excludes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs <Filter_1.dump> Filter_2.dump 2> Filter_2.log 
svnadmin create FooDest 
svnadmin load FooDest --ignore-uuid <Filter_2.dump> Load.log 2> Load_Errors.log 

किसी को भी इस का एक अच्छा उदाहरण है कि एक एकल फाइल या एक ही उप-निर्देशिका के निर्यात में से केवल एक छोटी सी हटाने की तुलना में अधिक है है?

फ़ाइलों का सेट परिभाषित करने का सबसे आसान तरीका 7 निर्देशिका पथों की सूची के साथ है। उन निर्देशिकाओं के अंदर सब कुछ रखने की जरूरत है और इतिहास से बाहर की हर चीज को बाहर निकाला जाना चाहिए।


सरलीकृत समस्या:

मैं एक Git भंडार जो फ़ाइलों है कि मैं अपनी ही भंडार में निकालने करना चाहते हैं के एक मुट्ठी भर है की है। समस्या यह है कि इन फ़ाइलों को मूल भंडार के इतिहास में बनाया और संशोधित किया गया था, इसलिए मुझे यह समझने में परेशानी हो रही है कि उन्हें निकालने के तरीके को कैसे निकाला जाए।

यहां मेरा इतिहास कैसा दिखता है (केवल अधिक काम करता है और अनदेखा करने के लिए बहुत कुछ) का एक सारांश है। आप देख सकते हैं मैं स्पष्ट रूप से बाद में इन फ़ाइलों के लिए हो सकता है की योजना नहीं थी चेरी इतिहास से बाहर उठाया:

commit 4a09d3f977a8595d9e3f61766a5fd743e4265a56 

M src/Foo/Bar/FileToExtract2.foo 
A src/Foo/Bar/FileToExtract3.bar 
D src/Foo/AnotherFileToIgnore.txt 

commit 05d26f23518083270cc45bf037ced29bec45e064 

M src/Foo/Blah/IgnoreThisOneToo.foo 
M src/Foo/AnotherFileToIgnore.txt 

commit 343187228f4bd8e4427395453034c34ebd9a95f3 

M src/Foo/Bar/FileToExtract1.txt 
M src/Foo/AnotherFileToIgnore.txt 

commit 46a0129104ac31291462f657292aab43f8883d8d 

A src/Foo/Bar/FileToExtract1.txt 
A src/Foo/Bar/FileToExtract2.foo 
M src/Foo/FileToIgnore.txt 

commit 3fe6af56f0d8dc42fcb5b0bafee41bff534ba2cc 

A src/ReadMe.txt 
A src/IgnoreMe.foo 
A src/Foo/FileToIgnore.txt 
A src/Foo/Blah/IgnoreThisOneToo.foo 
A src/Foo/AnotherFileToIgnore.txt 

अंत में, मैं क्या करना चाहते हैं पूरा के इतिहास के साथ एक साफ भंडार है बस src/Foo/Bar/ में फ़ाइलें। बाकी को नजरअंदाज किया जा सकता है। मैं इस भंडार को रखने के साथ भी ठीक हूं (यानी कोई इतिहास फिर से लिखना नहीं) और बस उस संपूर्ण निर्देशिका के लिए एक डिलीट करना।

एसवीएन में, मैं svnadmin dump, svndumpfilter, और svnadmin load का उपयोग करूंगा। अगर मैं सावधान था, तो मैं पथ को साफ करने के लिए मैन्युअल रूप से डंप फ़ाइल भी संपादित कर सकता था, आदि

मैं गिट कमांड देख रहा हूं और ऐसा करने का कोई तरीका देखने में असमर्थ हूं। किसी भी तरह की सहायता का स्वागत किया जाएगा।

उत्तर

7

आप git filter-branch का उपयोग कर सकते हैं और निर्देशिका को अपनी निर्देशिका में Foo अलग कर सकते हैं।
देखें:

+0

उत्कृष्ट। मुझे लगता है कि यह वही है जो मैं खोज रहा था। मैं आज रात कोशिश करूँगा। धन्यवाद! – mckamey

+0

ऐसा लगता है कि मुझे यही चाहिए, लेकिन अगर मैं नए छिद्रित भंडार में एक से अधिक उपनिर्देशिका शामिल करना चाहता हूं तो क्या होगा? ऐसा लगता है कि 'गिट फ़िल्टर-शाखा - subdirectory-filter ' केवल एक मान लेता है? – mckamey

+0

@McKAMEY: http://stackoverflow.com/questions/1425892/how-do-you-merge-two-git-repositories एक अच्छी शुरुआत है: submodules या subtree विलय। – VonC

3

SVN के svnadmin dump, svndumpfilter और svnadmin load होगा git fast-export, एक स्वयं की स्क्रिप्ट के बराबर (examples देखें) और git fast-import

+0

@ वॉनसी: लिंक प्रदान करने के लिए धन्यवाद। –

+0

मेरे पास 7 निर्देशिकाएं हैं जिनमें फ़ाइलों की सभी सूची शामिल हैं जिन्हें मुझे निकालने की आवश्यकता है। मैं इन 7 निर्देशिकाओं को सबकुछ फ़िल्टर करने के लिए निर्यात और आयात के बीच क्या निर्दिष्ट करूं? मुझे 'svndumpfilter शामिल' के बराबर की आवश्यकता है। – mckamey

+0

"उदाहरण देखें" लिंक फ़िल्टर स्क्रिप्ट के लिए केवल 'sed' s | refs/head/master | refs/head/other | "' का एक उदाहरण प्रदान करता है। मैं उन सभी फ़ाइलों को हटाने के लिए गिट को कैसे बताऊंगा जो मेरी 7 उपनिर्देशिकाओं में से एक के रूप में मौजूद नहीं हैं? – mckamey