2012-10-17 31 views
14

मैं svn2git का उपयोग करने के लिए git एक SVN परियोजना विस्थापित करने के लिए कोशिश कर रहा हूँ। हालांकि मुझे सभी इतिहास को संरक्षित करने में समस्याएं हैं। ऐसा लगता है क्योंकि ट्रंक अतीत में स्थानांतरित हो गया था। आदेश मैं उपयोग कर रहा हूँ है:ट्रंक स्थानांतरित होने पर मैं गिट में एसवीएन इतिहास कैसे रखूं?

$ svn2git http://mysvnserver.com/myproject/iPhone/ --no-minimize-url --authors ../authors.txt 

लेकिन यह सिर्फ मेरे इतिहास परियोजना वास्तव में 2010 में शुरू कर दिया इस तरह लग रही द्वारा शुरू अनुमानित 2011 के लिए वापस जा देता है:

myproject 
    trunk 
    branches 
    tags 

लेकिन 2011 में इसे बदल दिया गया:

myproject 
    iPhone 
    trunk 
    branches 
    tags 
    Android 
     trunk 
     branches 
     tags 

पुराने ट्रंक और शाखाएं आईफोन निर्देशिका के अंतर्गत गईं। यह कदम तब से शुरू होता है जब यह कदम पूरा हो गया था। यदि मैं आईफोन निर्देशिका में svn log करता हूं तो मुझे संक्षिप्त इतिहास मिलता है। लेकिन अगर मैं cd trunk; svn log तो मुझे पूरा इतिहास मिलता है।

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

$ svn2git http://mysvnserver.com/myproject/ --rootistrunk --authors ../authors.txt 

और

$ svn2git http://mysvnserver.com/myproject/ --rootistrunk -no-minimize-url --authors ../authors.txt 

किसी भी सफलता नहीं मिली।

उत्तर

10

मुझे बस एक ही समस्या थी। यहां बताया गया है कि मैंने इसे कैसे हल किया।

दोनों रिपो अलग से क्लोन करें।

git svn clone -s [original-svn-location] [original-clone-directory] 
git svn clone -s [new-svn-location] [new-clone-directory] 

पुराने रेपो डेटा को नए रेपो में जोड़ें।

cd [new-clone-directory] 
git remote add oldstuff ../[original-clone-directory] 
git fetch oldstuff 

अब मुश्किल हिस्सा ... क्या master की git log और oldstuff/master की (या शायद trunk और olstuff/trunk - लेकिन आप इसे सेट अप) और नए क्लोन और पिछले से पहले प्रतिबद्ध शा लिख पुराने क्लोन से चिया को समर्पित करें (चाल से ठीक पहले)।

git replace [first-commit-sha-from-new-clone] [last-commit-sha-from-old-clone] 

और पुनर्लेखन के लिए SHA हैश तो सब कुछ कोषेर है और तुम अब रेफरी की जगह की आवश्यकता है ...

git filter-branch 

और अब न अब जरूरी संदर्भ को साफ करने के।

git remote rm oldstuff 
rm -rf .git/refs/replace 

आप पहली बार अपने इतिहास से प्रतिबद्ध खो देंगे, लेकिन जब से कि प्रारंभिक कदम होना चाहिए (यानी: कोई वास्तविक फ़ाइल की सामग्री को बदल दिया है) यह शायद आपके लिए महत्वपूर्ण नहीं होंगे।

अब सभी इतिहास अभी भी बनाए रखा जाना चाहिए और git blame रिपोर्ट रेपो के पुराने इतिहास को याद है, तुम सही जानकारी फिर से दे रही है।

आप (पर कितनी बार अपनी परियोजना की जड़ स्थान बदल दिया है और/या कितने शाखाओं चाल के दोनों किनारों पर करता था निर्भर करता है) के रूप में की जरूरत है इस के रूप में अक्सर दोहराने के लिए सक्षम होना चाहिए।

पीएस - यह समाधान मैंने अपनी आवश्यकताओं के लिए अनुकूलित किया है, मुझे here मिला है (मुझे अपने भंडारों के लिए काम करने के लिए अपना भ्रष्टाचार दृष्टिकोण नहीं मिला - लेकिन प्रतिस्थापन का उपयोग खूबसूरती से काम करने लगता है)।

+0

मुझे अब समस्या को बहुत अच्छी तरह से याद नहीं किया जा सकता है, लेकिन मैंने इसे उत्तर के रूप में सेट किया क्योंकि यह वास्तव में समस्या को हल करने के तरीके के करीब है। मेरा मानना ​​है कि मैंने अलग-अलग शाखाओं का पूरा समूह बनाया है और फिर इतिहास को देखकर उन्हें एक साथ जोड़ दिया है। –

2

आप SubGit का उपयोग अपने SVN भंडार कन्वर्ट करने के लिए कर सकते हैं।

दुर्भाग्य से, 1.0 संस्करण है कि एक तुम हो की तरह जटिल लेआउट का समर्थन नहीं करता। लेकिन 1.1 EAP version है जो इसे अच्छी तरह से संभालता है। 1.0 और 1.1 संस्करण दोनों स्थानीय एसवीएन भंडार के साथ काम करते हैं, इसलिए आपको एसवीएन भंडार में प्रशासनिक पहुंच प्राप्त करनी होगी।

कृपया Git करने के लिए SVN भंडार कन्वर्ट करने के लिए में निम्न कार्य करें:

  1. प्रारंभिक विन्यास उत्पन्न करें।

    $ subgit configure SVN_REPO 
    
  2. शायद, सबगिट इस भंडार के अंदर दो परियोजनाओं का पता लगाएगा। AFAIU, आपको केवल एक गिट भंडार की आवश्यकता है। तो, आपको कॉन्फ़िगरेशन फ़ाइल में केवल एक 'गिट' अनुभाग रखना होगा। वहां कनवर्ट करने के लिए आवश्यक सभी शाखाएं निर्दिष्ट करें।

    $ EDITOR SVN_REPO/conf/subgit.conf 
    [core] 
        ... 
    [git "default"] 
        repository = .git 
        ... 
        trunk = trunk:refs/heads/master 
        branches = branches/*:refs/heads/* 
        tags = tags/*:refs/tags/* 
        shelves = shelves/*:refs/shelves/* 
        branches = iPhone/trunk:refs/heads/iPhone/master 
        branches = iPhone/branches/*:refs/heads/iPhone/* 
        tags = iPhone/tags/*:refs/tags/iPhone/* 
        branches = Android/trunk:refs/heads/Android/master 
        branches = Android/branches/*:refs/heads/Android/* 
        tags = Android/tags/*:refs/tags/Android/* 
        ... 
    [daemon] 
        ... 
    
  3. एसवीएन को गिट में कनवर्ट करें।

    $ subgit install SVN_REPO 
    
  4. इस पल SubGit पर SVN से सभी संशोधन Git में धर्मान्तरित। आप एसवीएनएनजीपीओ/.git पर परिवर्तित गिट भंडार पा सकते हैं। इसके अतिरिक्त सबगिट एसवीएन और गिट रिपोजिटरी को सिंक्रनाइज़ करता है, यह इसे प्राप्त करने के लिए विशेष हुक स्थापित करता है। यदि आवश्यक हो तो इन हुक से छुटकारा पाएं।

    $ subgit uninstall --purge SVN_REPO 
    

सब है कि। अब आपने पूरे इतिहास के साथ गिट भंडार को परिवर्तित कर दिया है।

ध्यान दें कि SubGit एक वाणिज्यिक उत्पाद है, लेकिन एक बार रूपांतरण इस तरह से स्वतंत्र है। उम्मीद है, यह आपके लिए अच्छा काम करता है।

+0

यह एक अच्छा समाधान की तरह दिखता है, लेकिन चूंकि यह एक लंबे समय मैं ऐसा किया है मैं समाधान सत्यापित नहीं कर सकता और जवाब के रूप में यह निर्धारित किया है। लेकिन अगर कोई और यह सत्यापित कर सकता है कि यह काम करता है, तो मुझे यह सही जवाब देने में खुशी होगी। –