2009-03-18 10 views
47

मेरे पास 2 परियोजनाओं में मेरी परियोजनाएं हैं। एसवीएन के तहत एक और गिट के तहत एक। जब भी मैं एसवीएन में कुछ बदलता हूं, मैं गिट भंडार में वही काम करना चाहता हूं।गिट के लिए एसवीएन diff कैसे लागू करें?

कहें कि मैं संशोधन 125 का उत्पादन करते हुए एसवीएन भंडार में बदलाव करता हूं। मैं अपने गिट भंडार में इन परिवर्तनों को कैसे लागू करूं (मान लीजिए कि मेरा गिट भंडार संशोधन 124 के साथ अद्यतित है)।

धन्यवाद।

उत्तर

46

मैं वास्तव में क्या किया/की तलाश में था:

cd /path/to/svn/repo 
svn diff -r 125 > /tmp/patch.diff 
cd /path/to/git/repo 
patch -p0 < /tmp/patch.diff 
+1

यह इतना अच्छा काम नहीं किया! –

+1

क्षमा करें, यह वास्तव में विशिष्ट स्थिति थी। मेरा सुझाव है कि यदि आपको परेशानी हो रही है तो आप एक प्रश्न पोस्ट करें :( – drozzy

+1

सामान्य रूप से, गिट-एसवीएन गिट रिपॉजिटरीज़ में एसवीएन आयात करने (और निर्यात करने) का एक बेहतर तरीका है। यह प्रतिबद्ध संदेश और लेखक की जानकारी रखेगा, और कई लोगों से निपटेंगे किनारे के मामले जो यहां दिए गए उत्तर को तोड़ देंगे। (बेशक, यह स्क्रिप्ट आपकी स्थिति के लिए अधिक उपयुक्त हो सकती है यदि बाहरी बाधाएं हैं जिन पर आपने चर्चा नहीं की है) – Rich

18

प्रयास करें:

svn diff | patch -d /path/to/git/repo -p0 

svn help diff देखें यदि आप किसी विशिष्ट संशोधन के diff निर्यात करना चाहते हैं।

+1

है क्यों -p0 के साथ इस काम को छोड़ दिया है नहीं चला? –

+0

http://linux.die.net/man/1/patch में देखें -पन्नम विशेष रूप से "निर्दिष्ट नहीं -p" शब्दों के लिए पृष्ठ खोजें। मुझे लगता है कि अगर आप इसे निर्दिष्ट नहीं करते हैं - पैच फ़ाइलपैथ को अनदेखा कर देगा और केवल फ़ाइल नाम का उपयोग करेगा। – drozzy

2

के रूप में आप ऊपर उल्लेख भी स्थापित करने पर विचार कर सकते पैच का उपयोग कर इसके अलावा एक post-commit hook तो आप इस हर बार जब आप कुछ नया करने के लिए प्रतिबद्ध करने के लिए नहीं है।

5

कोई भी git-svn क्यों पसंद नहीं करता है? मुझे नहीं लगता कि कोई इसके बारे में नहीं जानता है।

गिट-एसवीएन (और गिट-एचजी और गिट-सीवी और गिट-बीजीआर afaict) है। कम से कम के साथ Git-svn आप बस कर सकते हैं

git svn clone --stdlayout http://myrepo/root here 

-s का उपयोग कर (--stdlayout) मानक ट्रंक/शाखाओं/टैग/लेआउट मान लिया गया है, लेकिन आप इसे किसी भी तरह से जो (man git-svn) हो सकता है।

मानचित्रण द्विपक्षीय है, इसलिए आप मूल (गीट) रिमोट के साथ धक्का और खींच सकते हैं। कोई सवाल नहीं पूछा।

+0

प्रतिबद्ध होने के बाद स्वचालित पुश करने के लिए पोस्ट-प्रतिबद्ध हुक जोड़ने के लिए स्वतंत्र महसूस करें :) – sehe

+0

यह नहीं करता है विंडोज़ पर svn-git के साथ मेरे लिए काम नहीं करता है क्योंकि 'गिट लागू' विफल रहता है क्योंकि यह svn-style diffs के सापेक्ष पथों को सही तरीके से पार्स नहीं कर सकता है। –

+1

@the_mandrill erm ... 'patch -p1' (या -p0, या जो भी आपको स्ट्रिप करने की आवश्यकता है) का उपयोग करें? अरे रुको। Oooold सवाल। मुद्दा यह है कि आपको svn शैली diffs की आवश्यकता नहीं है। 'गिट चेरी-पिक' – sehe

0

नीचे मेरे लिए काम किया।

स्रोत: How to create and apply a patch with Git

सबसे पहले, एक नज़र क्या में परिवर्तन पैच में हैं ले लो। उस Git के साथ आसानी से कर सकते लागू

git apply --stat fix_empty_poster.patch 

ध्यान दें कि यह आदेश नहीं करता पैच लागू है, लेकिन केवल आप इसे क्या करेंगे के बारे में आंकड़े दिखाता है। अपने पसंदीदा संपादक के साथ पैच फ़ाइल में देखने के बाद, आप देख सकते हैं कि वास्तविक परिवर्तन क्या हैं।

अगला, आप रुचि रखते हैं कि पैच कितना परेशान है। गिट आपको वास्तव में इसे लागू करने से पहले पैच का परीक्षण करने की अनुमति देता है।

git apply --check fix_empty_poster.patch 

यदि आपको कोई त्रुटि नहीं मिलता है, पैच सफाई से लागू किया जा सकता। अन्यथा आप देख सकते हैं कि आप किस समस्या में भाग लेंगे।

पैच लागू करने के लिए, मैं गिट आवेदन के बजाय गिट am का उपयोग करूंगा। इसका कारण यह है कि गिट आपको एक लागू पैच से साइन आउट करने की अनुमति देता है। यह बाद के संदर्भ के लिए उपयोगी हो सकता है।

git am --signoff < fix_empty_poster.patch 

Applying: Added specs to test empty poster URL behaviour 
Applying: Added poster URL as part of cli output 

ठीक है, पैच साफ़ रूप से लागू किए गए थे और आपकी मास्टर शाखा अपडेट कर दी गई है। बेशक, यह सुनिश्चित करने के लिए कि कुछ भी टूटा नहीं गया है, फिर से अपने परीक्षण चलाएं।

आप गिट लॉग में, आप पाएंगे कि प्रतिबद्ध संदेशों में "साइन-ऑफ-बाय" टैग होता है। इस टैग को गीथूब और अन्य लोगों द्वारा कोड में समाप्त होने के तरीके के बारे में उपयोगी जानकारी प्रदान करने के लिए पढ़ा जाएगा।

4

आप SVN में एक पैच पैदा करते हैं और Git के साथ इसे बाद में लागू करने के लिए जा रहे हैं, --git command-line option उपयोग करने के लिए मत भूलना:

--git

तैयार किया गया SVN diff के लिए एक विशेष उत्पादन मोड सक्षम लोकप्रिय गिट वितरित संस्करण नियंत्रण सिस्टम के साथ क्रॉस-संगतता के लिए।

उदाहरण के लिए,

svn diff --git -r 125 > /tmp/patch.diff

+0

svn: अवैध विकल्प: --git – sloven

+0

@Nik मुझे लगता है कि आपका svn क्लाइंट बहुत पुराना है। Svn --version का नतीजा क्या है? – bahrep

+0

svn संस्करण 1.6.13 – sloven

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