2014-09-19 4 views
6

द्वारा इसे प्रतिस्थापित करने के लिए मुझे एक इंटरैक्टिव रीबेस स्वचालित करने या अन्य आदेशों से इसे बदलने की आवश्यकता है। बस मुझे अपनी वर्तमान स्थिति समझाएं:गिट: इंटरैक्टिव रीबेस को स्वचालित करने के लिए/समकक्ष गिट कमांड

एक svn-> गिट संक्रमण में मुझे एसवीएन के दौरान किए गए "इतिहास कट ऑफ" को ठीक करने के लिए नव निर्मित गिट भंडार को पुनर्जीवित करने की आवश्यकता है। समस्या को ठीक करने के लिए यहां मेरा मैन्युअल वर्कफ़्लो है।

branchNEW: containing history from SOMEDAY until now 
branchOLD: containing history from past to SOMEDAY 

संपादित या ascii के रूप में:

branchNEW:  Y - Z 
branchOLD: W - X 

दोनों शाखाओं कोई आम करता है।

मूलभूत विचार अब शाखा के ऊपर शाखा को पुनर्स्थापित करना है। दुर्भाग्यवश कुछ समय पहले कुछ रिफैक्टरिंग कर रहे हैं: कुछ फाइलें दूसरी निर्देशिका में ले जाया गया था। रिबेस का नतीजा अब है, कि प्रत्येक स्थानांतरित फ़ाइल दोनों जगहों पर मौजूद है।

संपादित

some file exist in X 
the (nearly) same files also exist in Y, just on another path 

branchNEW: W - X - Y - Z 
(after rebase) 

रिबेस के बाद, सिर अब एक्स के फ़ाइलें हैं और Y के मैं भी जोड़ने के लिए नया branchOLD जो पुरानी फ़ाइलों को हटा करने के लिए प्रतिबद्ध की कोशिश की। रिबेस एसवीएन-हेड और गिट-हेड बाइनरी समान होने के बाद, लेकिन "गिट लॉग - फॉलो" काम नहीं करता है।

अब मुख्य समस्या यह है: मैं एक दूसरे, इंटरैक्टिव रिबेस का उपयोग करके इसे ठीक करने में सक्षम हूँ:

git rebase -i SHA 

SHA वर्ष जड़ का SHA-आईडी branchNEW में प्रतिबद्ध है। अब संपादक में मुझे शीर्षतम प्रतिबद्धता के लिए "पिक" को "संपादित करें" में बदलना होगा। संपादक से बाहर निकलने के बाद मैं अब Git के इस प्रमुख के बाद गलत फ़ाइलों

git rm -f fileA fileB 
git commit --amend 
git rebase --continue 

हटाने के लिए SVN की और इसके अलावा में सिर करने के लिए द्विआधारी समान है, Git पूरा इतिहास "Git लॉग --Follow" काम करता है और यह भी स्थानांतरित फ़ाइलों के लिए।

चूंकि यह चरण भविष्य में एक विशाल वीसीएस संक्रमण का एक छोटा सा हिस्सा है, इसलिए मुझे पूरी प्रक्रिया को स्क्रिप्ट करने की आवश्यकता है। लेकिन उपरोक्त चरणों को स्वचालित करने के लिए कैसे?

(मुझे पता है कि शास ही नहीं रहेंगे, लेकिन मैं SVN-आईडी जो प्रत्येक में अंतर्निहित है प्रतिबद्ध संदेश से आवश्यक SHA प्राप्त करने में सक्षम हूँ)

+0

मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन शायद 'Git फिल्टर-branch' आप मदद कर सकता है। – Jubobs

उत्तर

3

मैं एक संभव समाधान पाया:

गिट रिबेस --इंटरएक्टिव एक संपादक को "रीबेज कमेट्स की सूची" (वह सूची जहां आप चुन सकते हैं, स्टैश, एडिट, ...) भेज सकते हैं। किस प्रकार का संपादक कॉन्फ़िगर किया जा सकता है। तो समाधान इस इंटरैक्टिव रिबेस के लिए वैकल्पिक "संपादक" को कॉन्फ़िगर करना है।

GIT_SEQUENCE_EDITOR="command" git rebase -i SHA 

आदेश एक खोल स्क्रिप्ट है या सिर्फ एक सरल एसईडी सकता है:: यह वातावरण चर GIT_SEQUENCE_EDITOR उपयोग किया जा सकता

GIT_SEQUENCE_EDITOR="sed -i 's/^pick ce5efdb /edit ce5efdb /;/^pick ce6efdb /d'" git rebase -i SHA 

महत्वपूर्ण: "रिबेस की सूची करता है" के रूप में पारित हो जाता है कमांड पर फ़ाइल करें। तो आदेश को फ़ाइल नाम को पैरामीटर के रूप में स्वीकार करना होगा और परिणाम को उसी फ़ाइल में लिखना होगा। "sed -i" वास्तव में यह कर रहा है।

+0

मुझे स्क्रिप्ट बनाने के लिए एक रिपॉजिटरी पर कुछ ऐतिहासिक गतिविधियों के स्क्वैशिंग को स्वचालित करने की आवश्यकता है जो एसवीएन से माइग्रेशन के लिए सभी आवश्यक संचालन करेगा, अवधारणा के सबूत के रूप में कि अन्य प्रोजेक्ट सदस्य पूरी तरह से पुन: उत्पन्न करने के तरीके में उपयोग कर सकते हैं सत्यापित करें कि माइग्रेशन सही है। यह सिर्फ सही है। – Irfy

0

expect आपकी मदद भी कर सकता है। हालांकि यह काफी आप क्या करने की जरूरत नहीं है, तो आप अपने प्रक्रिया को स्वचालित करने कुछ इसी तरह का उपयोग करने में सक्षम होना चाहिए:

#!/usr/bin/env expect 
spawn git rebase -i HEAD~2 

# down, delete word, insert 's' (for squash), Escape, save and quit 
send "jdwis \033:wq\r" 

expect "# This is a" 

# down 4, delete 3 lines, save and quit 
send "4j3d:wq\r" 

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