2016-09-30 8 views
12

मेरे पास एक गिट रेपो है जो एक अन्य गिट रेपो से क्लोन है जो एक विशाल एसवीएन रेपो से क्लोन है। हम एसवीएन से अन्य गिट रेपो अपडेट कर सकते हैं और इसे एसवीएन से प्रतिबद्ध कर सकते हैं, लेकिन किसी अन्य उपयोगकर्ता के साथ।गिट को कैसे बताना है कि वास्तव में एक विवादित इतिहास में दो प्रतिबद्धताएं समान हैं?

मैं अपने स्थानीय उपयोगकर्ताओं को अपने स्वयं के उपयोगकर्ता के साथ सीधे एसवीएन रेपो में प्रकाशित करना चाहता हूं।

यह है कि मैं क्या करने की कोशिश की है: मैं मैन्युअल git-svn शाखा बनाई, .git/config

[branch "master"] 
[svn-remote "svn"] 
     url = https://url/to/svn/trunk/repo_name 
     fetch = :refs/remotes/git-svn 

फिर git svn fetch को यह जोड़ने, 32k प्रतिबद्ध डाउनलोड किया।

  1. Git से एक::

    लेकिन मैं दो संबंध तोड़ना इतिहास के साथ समाप्त हो गया

    1. 674c35a कि मूल क्लोन के बिंदु पर SVN रेपो के राज्य का प्रतिनिधित्व करने पर प्रारंभ हो।
    2. शाखा master हमेशा एसवीएन (अन्य गिट रेपो के माध्यम से) के साथ सिंक्रनाइज़ होती है।
    3. शाखा dev हमारे वर्तमान विकास हैं, जिन्हें master (आमतौर पर squashed) में विलय किया जाना चाहिए, और फिर एसवीएन रेपो पर वापस प्रतिबद्ध होना चाहिए।
  2. SVN रेपो के लिए एक: उचित प्रारंभिक साथ
    1. शुरू होता है के लिए प्रतिबद्ध।
    2. इसमें 30k + काम है।
    3. यह प्रतिबद्धता कि गिट मूल रूप से एसवीएन [fb1b9c7] से क्लोन किया गया है (लेकिन केवल पिछले कामों से भिन्नता के साथ, पूरे रेपो को प्रारंभ प्रतिबद्धता के रूप में नहीं)।
    4. फिर वही काम करता है (100+) जो git/origin/master पर आम होना चाहिए।

मैं कैसे Git वास्तव में एक ही एक SVN के रूप में बता सकता है कि शुरुआती के लिए प्रतिबद्ध (674c35a) है प्रतिबद्ध (fb1b9c7)? तो गिट किसी भी तरह से समझ सकता है कि क्लोन के बाद master में काम करता है, वास्तव में git-svn जैसा ही है?

मैंने --onto के साथ पुन: प्रयास करने की कोशिश की है, जैसा कि here समझाया गया है, लेकिन वास्तव में वह नहीं था जो मैं चाहता था (काम शाखा के शीर्ष पर नहीं है)।

*--*--*--fb1b9c7--*--*--* [git-svn] (version of master from SVN) 

     674c35a--*--*--* [master] (version of master from Git) 
         \ 
          *--*--*--* [dev] 

ऐसा लगता है कि आप दो मुद्दे हैं:

+3

गिट + एसवीएन ... क्या बात है? इस परियोजना के लिए – Hackerman

+0

एसवीएन अनिवार्य है, लेकिन मेरी टीम गिट (वितरित, कोड समीक्षा, शाखाएं, आदि) का उपयोग करना चाहता था। – RSFalcon7

उत्तर

0

आपका इतिहास शायद कुछ इस तरह दिखता अपना Git इतिहास शामिल नहीं है 30k +, पूर्ण SVN इतिहास से करता है और dev पर आधारित है (अधूरा) एसवीएन संस्करण के बजाय गिट इतिहास।

git rebase --onto git-svn master dev 

मेरे प्रयोगों से संकेत मिलता है git rebase परवाह नहीं है कि लक्ष्य शाखा (git-svn) आधार के रूप में एक ही इतिहास नहीं है:

fb1b9c7 == 674c35a के बाद से, तुम क्या करने में सक्षम होना चाहिए शाखा (master)। इससे कोई फर्क नहीं पड़ता कि एसवीएन केवल diffs स्टोर करता है, क्योंकि गिट-एसवीएन ने उन अंतरों को वास्तविक गिट में परिवर्तित करने के दौरान बदल दिया होगा।

के बाद से इतिहास में एक ही सामग्री के होते हैं, आप भी ऐसा करने में सक्षम होना चाहिए:

git checkout dev 
git rebase git-svn 

उसके बाद, आप master हटा सकते हैं और कि पेड़ कचरा-एकत्र बाद में प्राप्त कर सकते हैं। (आप अभी भी एक अलग master शाखा की जरूरत है, तो मूल master को हटाने के बाद git checkout -b master git-svn करते हैं।)

जब आप ने कहा:

(प्रतिबद्ध हैं नहीं शाखा के शीर्ष में)

मुझे लगता है कि आप fb1b9c7 और 674c35a पर काम करने का जिक्र कर रहे हैं। हालांकि, इससे कोई फर्क नहीं पड़ता कि उन लोगों को इतिहास में दफनाया जाता है, क्योंकि हम उपरोक्त वर्णित एक (fb1b9c7) का चयन करेंगे, और दूसरे को कचरा-एकत्रित करने दें।

0

यदि आप एक प्रतिबद्धता को किसी अन्य प्रतिबद्धता से प्रतिस्थापित करना चाहते हैं, तो git replace का उपयोग करें, जैसे git replace 674c35a fb1b9c7
यदि आप इसे स्थायी बनाना चाहते हैं, तो git rebase का उपयोग करें।

1

मेरा मानना ​​है कि मैं एक तरीका है जिसके मेरी ब्लॉग पोस्ट Grafting History with Git में इस के लिए काम करना चाहिए जो साइट नियमों का पालन करने के प्रयोजनों के लिए मैं यहाँ संक्षेप में प्रस्तुत करेंगे है:

वर्तमान स्थिति:

  • दो Git

      : अपसारी इतिहास लेकिन एक मूल

    लक्ष्य राज्य के साथ रेपोस

  • एक दो शाखाएं उन अपसारी इतिहास

  • (मुझे लगता है कि आप पहले से ही इस मिल गया है)
  • लॉग की तुलना द्वारा विचलन की बात का पता लगाएं का प्रतिनिधित्व Git शाखाओं में दोनों के इतिहास में कनवर्ट साथ Git रेपो और देख जब पेड़ हैश में परिवर्तन
    • पेड़-आईडी की एक सूची प्राप्त और प्रत्येक शाखा पर प्रतिबद्ध-आईडी git log --reverse --format="%T %H" का उपयोग कर और इस को बचाने के एक फाइल करने के लिए
    • सूचियों की तुलना करें जहां पेड़ हैश diverges देखने के लिए (मैं एक diff प्रोग्राम है जो कॉलम का उपयोग कर सकते हैं, तो आप सिर्फ awk और diff हालांकि इस्तेमाल कर सकते हैं)
  • चेक आउट पर विचलन की बात रेपो शाखा लक्षित करते हैं और एक नई शाखा
  • लक्ष्य
  • में स्रोत से सभी वस्तुओं लायें मूल स्रोत में प्रत्येक संशोधन के लिए बनाने के लिए, लक्ष्य पर नया पुनरीक्षण बनाने कि
    • के पेड़ की एक चेकआउट हैका उपयोग कर विदेशी संशोधन
    • git commit --reuse-message $ORIGINAL_COMMIT

या ... बिल्ली पेड़-आईडी की अपनी सूची + प्रतिबद्ध-आईडी का उपयोग कर इस स्क्रिप्ट में मूल प्रतिबद्ध संदेश उपयोग करता है।

 
#!/bin/bash 
# graft script 
while read TREE COMMIT 
do 
git read-tree -um $TREE 
git commit --reuse-message $COMMIT 
done 
संबंधित मुद्दे