2011-04-08 7 views
8

का कारण बनता है मुझे गिट-एसवीएन डॉकिट्स के साथ समस्या हो रही है जिससे गिट रिपोजिटरी खोने का ट्रैक कम हो जाता है।गिट-एसवीएन डॉकिटिट शाखा विभाजन

मैं यह सुनिश्चित करने का प्रयास करता हूं कि गिट में मास्टर शाखा हमेशा एसवीएन भंडार में ट्रंक का पालन करती है। तो जब भी मैं काम कर रहा हूं, मैं एक विषय शाखा में हूं।

थोड़ी देर के लिए एक विषय शाखा में कार्य करना

git checkout -b my-topic 
git commit -m "blah blah blah" 

तो मैं तय मैं

git checkout master 
git svn rebase #get any changes in svn 
git rebase master my-topic 
git merge my-topic --ff-only 

यहां तक ​​महारत हासिल करने के पीठ में अपनी शाखा विलय करना चाहते हैं, सब कुछ: यहाँ मेरी परिदृश्य है अच्छा चला गया है मैं अब दोनों मास्टर और मेरे विषय से हटकर गति को और प्रतिबद्ध एक ही तरफ इशारा किया है, और पूरे इतिहास में इस तरह दिखता है:

A -- B -- C - master + my-topic 

हालांकि, जब मैं

git svn dcommit 

मैं अंत करना एक पेड़ है कि इस तरह दिखता है (ख और ग करता मैं मूल रूप से विषय के लिए किए गए हैं):

-- B -- C - my-topic 
/
A -- B -- C - master + remotes/trunk 

यह dcommit प्रक्रिया के दौरान की तरह लगता है, Git SVN अप करने के लिए प्रतिबद्ध धक्का, फिर उन्हें वापस की चोटी पर रिप्ले मास्टर। मुझे लगता है कि समस्या यह है कि वे अलग-अलग कम्यूटर जानकारी प्राप्त करते हैं। मैं कछुआ प्लिंक और एक एसएसएच कुंजी के साथ svn में लॉग इन कर रहा हूँ।

Git भंडार में

करता है कि SVN करने के लिए धक्का दिया नहीं किया गया है committer जानकारी है के रूप में:

Collin Hockey <[email protected]> 

करता है कि SVN भंडार पर पुश किए गए हालांकि इस राशि:

chockey <[email protected]> 

वहाँ है किसी भी तरह से मैं इन शाखाओं को विभाजित करने से रोक सकता हूं? मैं इसे

git rebase master my-topic 

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

उत्तर

10

git svn dcommit आदेश कार्यों के लिए इस प्रकार है:

  1. का पता लगाएं अंतिम प्रतिबद्धता एसवीएन से आ रही है; यह फोन last-svn
  2. last-svn..HEAD सबवर्सन तक की सीमा में प्रतिबद्ध भेजें (वैसे ई-मेल को त्यागकर)
  3. रीसेट SVN से HEADlast-svn
  4. को अद्यतन और इसी करता
बना सकते हैं

दूसरे शब्दों में, आप एसवीएन को भेजे जाने वाले कामों को नष्ट कर देते हैं और एसवीएन से अद्यतन से पुनर्निर्मित होते हैं। यह तब हो जाना चाहिए क्योंकि प्रतिबद्ध है कि SVN से आते हैं Git के साथ बनाया से भिन्न क्यों हैं:

  • उनका वर्णन SVN संशोधन
  • उनके लेखक ई-मेल SVN उपयोगकर्ता नाम से की जाती है का संदर्भ होता है

यही कारण है कि आपकी शाखा my-topicmaster से अलग हो जाती है।

आप git svn dcommit--authors-file और --authors-prog विकल्पों के साथ एसवीएन उपयोगकर्ता नाम से लेखक ई-मेल को कस्टमाइज़ कर सकते हैं।

+1

ऐसा लगता है कि यह थोड़ा बेहतर काम करता है, लेकिन काम अभी भी अलग हैं (उनके पास अलग-अलग समय भी हैं)। क्या वास्तव में उन्हें नए काम करने से रोकने के लिए एक तरीका है (या केवल स्वचालित रूप से दोनों शाखाओं पर काम करता है), या क्या यह केवल गिट-एसवीएन पुल का उपयोग करने के ब्रेक हैं? – Collin

+2

@ कोलिन यह गिट-एसवीएन काम करता है: एसवीएन काम करता है, और गिट ईमानदारी से उन्हें प्रतिबिंबित करता है। उस व्यवहार को बदलने का कोई तरीका नहीं है (बेशक अपना खुद का गिट-एसवीएन सिंक टूल लिखकर)। –

+1

जानकारी के लिए धन्यवाद। मैं डॉकिटिटिंग के बाद बस अपनी शाखा को रिबैस करने के लिए चिपक जाऊंगा। लेखकों की फाइल सामग्री मेरे इतिहास को बहुत सुंदर बनाती है :) – Collin

3

आप सही हैं, कि गिट फिर से svn से फिर से काम करता है। गिट में शाखाएं केवल संकेतक (या वहां आईडी/हैंश) होती हैं।SVN से प्रतिबद्ध अलग हैश होगा, और केवल अभी चेक आउट शाखा git svn dcommit द्वारा अद्यतन किया जाता है, तो अपने विषय शाखा अभी भी बताते हैं पुराने करता