svn - इतिहास के साथ एसवीएन रिपॉजिटरी को नए जीआईटी भंडार में कैसे स्थानांतरित करना है?




git version-control (20)

GitHub में अब एक एसवीएन रिपॉजिटरी से आयात करने की सुविधा है मैंने कभी कोशिश नहीं की, हालांकि।

मैं गीट मैनुअल, अकसर किये गए सवाल, जीआईटी - एसवीएन क्रैश कोर्स आदि पढ़ता हूं और ये सभी इसे और समझाते हैं, लेकिन कहीं भी आप एक सरल निर्देश प्राप्त कर सकते हैं जैसे:

एसवीएन भंडार में: svn://myserver/path/to/svn/repos

Git रिपॉजिटरी में: git://myserver/path/to/git/repos

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

मुझे यह अपेक्षा नहीं है कि यह आसान है, और मुझे उम्मीद नहीं है कि यह एक एकल आदेश हो। लेकिन मुझे उम्मीद है कि यह कुछ भी समझाए जाने की कोशिश नहीं करेगा- बस यह बताने के लिए कि इस उदाहरण को देने के लिए कौन से कदम उठाने होंगे।


एक अन्य के रूप में, git-stash आदेश git-svn dcommits के साथ git की कोशिश कर रहा है जब एक आकस्मिक धन है।

एक विशिष्ट प्रक्रिया:

  1. जीआईटी रेपो सेट अप करें
  2. विभिन्न फाइलों पर कुछ काम करते हैं
  3. जीआईटी का उपयोग करते हुए, कुछ कामों को जांचने का निर्णय लेते हैं
  4. svn-dcommit निर्णय svn-dcommit
  5. खतरनाक "गंदे इंडेक्स" के साथ त्रुटि नहीं पहुंचा सकती

समाधान (git 1.5.3+) की आवश्यकता है:

git stash; git svn dcommit ; git stash apply

मैं svn2git स्क्रिप्ट का इस्तेमाल किया और एक जादू की तरह काम करता है! https://github.com/nirvdrum/svn2git



मैं सिर्फ Git समुदाय के लिए मेरे योगदान जोड़ना चाहते थे। मैं एक साधारण बैश स्क्रिप्ट जो पूर्ण आयात को स्वचालित लिखा था। अन्य माइग्रेशन उपकरण के विपरीत, इस उपकरण jGit के बजाय देशी Git पर निर्भर करता है। यह उपकरण भी एक बड़ा संशोधन इतिहास और या बड़े धब्बे के साथ खजाने का समर्थन करता है। यह GitHub के माध्यम से उपलब्ध है:

https://github.com/onepremise/SGMS

यह स्क्रिप्ट निम्न स्वरूप के साथ SVN में संग्रहीत परियोजनाओं में परिवर्तित कर देंगे:

/trunk
  /Project1
  /Project2
/branches
     /Project1
     /Project2
/tags
 /Project1
 /Project2

यह योजना भी रूप में अच्छी तरह लोकप्रिय और समर्थित है:

/Project1
     /trunk
     /branches
     /tags
/Project2
     /trunk
     /branches
     /tags

प्रत्येक परियोजना परियोजना नाम से अधिक सिंक्रनाइज़ हो जाएगी:

Ex: ./migration https://svnurl.com/basepath project1

आप पर पूरा रेपो परिवर्तित करना चाहते हैं, तो निम्न सिंटैक्स का उपयोग:

Ex: ./migration https://svnurl.com/basepath .

जादू:

$ git svn clone http://svn/repo/here/trunk

गिट और एसवीएन बहुत अलग तरीके से काम करते हैं आपको गिट जानने की जरूरत है, और यदि आप एसवीएन अपस्ट्रीम से बदलाव ट्रैक करना चाहते हैं, तो आपको git-svn सीखना होगा। git-svn मैन पेज का एक अच्छा उदाहरण अनुभाग है:

$ git svn --help

मैं git-svn को लगातार उपयोग करने की कोशिश करने से पहले गिट के साथ सहज रहने का सुझाव देता हूं, यानी एसवीएन को केंद्रीकृत रेपो के रूप में रखना और स्थानीय स्तर पर गीट का उपयोग करना।

हालांकि, सभी इतिहास के साथ एक सरल प्रवास के लिए, यहां कुछ सरल कदम हैं:

स्थानीय रेपो शुरू करें:

mkdir project
cd project
git svn init http://svn.url

चिह्नित करें कि आप संशोधन को आयात करना कितनी दूर वापस करना चाहते हैं:

git svn fetch -r42

(या सभी revs के लिए सिर्फ "git svn fetch")

वास्तव में तब से सब कुछ प्राप्त करें:

git svn rebase

आप गीटक के साथ आयात के परिणाम की जांच कर सकते हैं। मुझे यकीन नहीं है कि यह विंडोज पर काम करता है, यह OSX और Linux पर काम करता है:

gitk

जब आपको स्थानीय स्तर पर एसवीएन रेपो क्लोन मिल गया है, तो आप इसे आसानी से सहयोग के लिए एक केंद्रीकृत गीप रेपो में डाल सकते हैं।

पहले अपना रिक्त रिमोट रेपो (शायद गिटहब पर हो?) बनाएँ:

git remote add origin [email protected]:user/project-name.git

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

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

इसके बाद, आप अपने खुद के git_remote_branch टूल को बाहर करने में दिलचस्पी ले सकते हैं, जो दूरस्थ शाखाओं से निपटने में मदद करता है:

पहली व्याख्यात्मक पोस्ट: " गिट रिमोट शाखाएं "

नवीनतम संस्करण के लिए अनुवर्ती: " git_remote_branch के साथ सहयोग करने का समय "


एक Git रिपोजिटरी के लिए अपने सबवर्सन रिपॉजिटरी को स्वच्छ रूप से माइग्रेट करें सबसे पहले आपको एक फाइल बनाना पड़ता है जो कि आपके उपविभागीकरण लेखक नामों को गिट प्रेषकों के नाम से जोड़ता है, कहते हैं कि ~/authors.txt authors.txt:

jmaddox = Jon Maddox <[email protected]>
bigpappa = Brian Biggs <[email protected]>

फिर आप सबवर्सन डेटा को एक जीआईटी भंडार में डाउनलोड कर सकते हैं:

mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

अगर आप मैक पर हैं, तो आप git-svn को git-core +svn स्थापित करके मैकपॉर्ट्स से प्राप्त कर सकते हैं।

यदि आपके वांछित भंडार एक ही मशीन पर वांछित जीआईटी रिपॉजिटरी के रूप में है, तो आप इन वाक्यविन्यास को init चरण के लिए उपयोग कर सकते हैं, अन्यथा सभी समान:

git svn init file:///home/user/repoName --no-metadata

सिर्फ जीआईटी, एसवीएन, और बाश का उपयोग करते हुए कुछ हद तक विस्तारित उत्तर। इसमें एसवीएन रिपॉजिटरी के लिए कदम शामिल हैं जो ट्रंक / शाखाओं / टैग डायरेक्टरी लेआउट के साथ पारंपरिक लेआउट का उपयोग नहीं करते हैं (एसवीएन इस तरह के लेआउट को लागू करने के लिए बिल्कुल कुछ भी नहीं है)।

मैपिंग फ़ाइल के लिए टेम्प्लेट बनाने में और विभिन्न लोगों के लिए अपने एसवीएन रेपो को स्कैन करने के लिए सबसे पहले इस स्क्रिप्ट का उपयोग करें:

#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
  echo "${author} = NAME <[email protected]>";
done

एक authors फाइल बनाने के लिए इसका उपयोग करें जहां आप अपने डेवलपर्स द्वारा सेट किए गए उपयोगकर्ता नामों और ईमेल के लिए svn उपयोगकर्ता नामों को मैप करते हैं, git config गुणों user.name और user.email (ध्यान दें कि GitHub जैसी सेवा के लिए केवल मेल मेल पर्याप्त है)।

उसके बाद git svn ने svn रिपॉजिटरी को एक git रिपॉजिटरी में क्लोन किया है, मैपिंग के बारे में बता रहा है:

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

यह अविश्वसनीय रूप से लंबे समय तक ले सकता है, क्योंकि git svn अलग-अलग प्रत्येक टैग या शाखा के लिए प्रत्येक संशोधन की जांच करेगा। (ध्यान दें कि एसवीएन में टैग सिर्फ सचमुच शाखाएं हैं, इसलिए वे गिट में समाप्त होते हैं)। आप एसवीएन में पुरानी टैग्स और शाखाओं को निकालकर इसे तेज कर सकते हैं जिसे आपको आवश्यकता नहीं है।

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

git svn rebase --continue

बहुत सारे मामलों में आप यहां काम कर रहे हैं लेकिन अगर आपके एसवीएन रेपो में एक अपरंपरागत लेआउट है जहां आपके पास एसवीएन में एक निर्देशिका है, तो आप एक जीआईटी शाखा में डालना चाहते हैं, तो आप कुछ अतिरिक्त कदम उठा सकते हैं।

सबसे आसान तरीका है सिर्फ अपने सर्वर पर एक नया एसवीएन रेपो बनाने के लिए जो सम्मेलन का पालन करता है और अपनी निर्देशिका को ट्रंक या शाखा में रखने के लिए svn copy का उपयोग करता है। यह एकमात्र तरीका हो सकता है अगर आपकी निर्देशिका रेपो की जड़ में सभी तरह से हो, जब मैंने आखिरी बार इस git svn केवल चेकआउट करने से इनकार कर दिया।

आप यह भी git का उपयोग कर सकते हैं git svn clone केवल उस निर्देशिका का उपयोग करें जिसे आप जीआईटी शाखा में रखना चाहते हैं।

चलाने के बाद

git branch --set-upstream master git-svn
git svn rebase

ध्यान दें कि यह आवश्यक गीट 1.7 या अधिक है।


यहां एक साधारण शेल स्क्रिप्ट है जिसमें कोई निर्भरता नहीं है जो एक या अधिक एसवीएन रिपॉजिटरी को जीआईटी में बदल देती है और उन्हें गिटहब में डाल देती है।

https://gist.github.com/NathanSweet/7327535

स्क्रिप्ट के बारे में 30 लाइनों में: जीआईटी एसवीएन का इस्तेमाल करते हुए क्लोन, एसवीएन :: अव्यवस्थित गुणों से एक .gitignore फ़ाइल बनाता है, एक नंगे जीआईटी भंडार में धकेलती है, एसवीएन ट्रंक को मास्टर करने के लिए नामित करता है, एसआईवीएन टैग को जीआईटी टैग में परिवर्तित करता है, और इसे GitHub टैग्स को संरक्षित करते समय

मैं Google कोड से गिटहब तक एक दर्जन एसवीएन खजाने को स्थानांतरित करने के लिए बहुत दर्द के माध्यम से चला गया यह मदद नहीं की है कि मैं विंडोज का इस्तेमाल किया रूबी मेरे पुराने डेबियन बॉक्स पर टूटी हुई सभी प्रकार की थी और इसे विंडोज पर काम करना एक मजाक था अन्य समाधान सिगविन पथ के साथ काम करने में विफल रहे। यहां तक ​​कि एक बार मुझे कुछ काम मिल गया, मुझे पता नहीं था कि टैग को गिटहब पर कैसे दिखाया जा सकता है (गुप्त है --फ़्लो-टैग)।

अंत में मैं एक साथ दो छोटी और सरल लिपियों को एक साथ खींचा, ऊपर लिखे गए, और यह महान काम करता है। समाधान की तुलना में किसी भी अधिक जटिल होने की आवश्यकता नहीं है!


यदि आप SourceTree का उपयोग कर रहे हैं तो आप सीधे ऐप से यह कर सकते हैं। गोटो फाइल -> नया / क्लोन करें तो निम्न करें:

  1. "स्रोत पथ / URL" के रूप में दूरस्थ एसवीएन यूआरएल दर्ज करें
  2. संकेत मिलने पर आपके क्रेडेंशियल दर्ज करें
  3. स्थानीय फ़ोल्डर स्थान को "गंतव्य पथ" के रूप में दर्ज करें
  4. उसे एक नाम दे दो।
  5. उन्नत विकल्पों में "प्रकार के स्थानीय भंडार बनाएँ" में ड्रॉपडाउन से "Git" चुनें
  6. आप क्लोन से वैकल्पिक रूप से संशोधन को निर्दिष्ट कर सकते हैं।
  7. क्लोन को मारो

स्रोतट्री में रेपो खोलें और आप देखेंगे कि आपका कथित संदेश माइग्रेट किए गए हैं।

अब रिपॉजिटरी -> रिपॉजिटरी सेटिंग्स पर जाएं और नए दूरस्थ रेपो विवरण जोड़ें। यदि आप चाहें तो SVN रिमोट को हटा दें (मैंने इसे "कॉन्फ़िग फाईल संपादित करें" विकल्प के माध्यम से किया था।

जब आप तैयार हों और कोड स्वतंत्र रूप से नए दूरस्थ रेपो में कोड को दबाएं।


आपको स्थापित करना होगा

git
git-svn

इस लिंक से कॉपी किया गया http://john.albin.net/git/convert-subversion-to-git

1. सभी सबवर्सन कमिटरों की सूची पुनर्प्राप्त करें

सबवर्सियन प्रत्येक कमिट के लिए यूज़रनेम की सूची करता है गिट के कॉमिट्स में बहुत अधिक डेटा मौजूद है, लेकिन इसके सरलतम पर, लेखक के लिए नाम और ईमेल सूचीबद्ध होना चाहिए। डिफ़ॉल्ट रूप से git-svn उपकरण केवल लेखक और ईमेल क्षेत्रों दोनों में एसवीएन उपयोगकर्ता नाम की सूची देगा। लेकिन थोड़ा सा काम करके, आप सभी एसवीएन उपयोगकर्ताओं की एक सूची बना सकते हैं और उनके संबंधित गीट नाम और ईमेल क्या हैं। यह सूची जीआईटी-एसवीएन द्वारा सही एसटीवी उपयोगकर्ता नामों को उचित जीआईटी कमेटरों में बदलने के लिए इस्तेमाल किया जा सकता है।

अपने स्थानीय सबवर्सन चेकआउट की जड़ से, यह कमांड चलाएं:

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt

यह सभी लॉग संदेशों को पकड़ लेगा, उपयोगकर्ता नामों को हटा देगा, किसी भी डुप्लिकेट उपयोगकर्ता नाम को समाप्त करेगा, उपयोगकर्ता नामों को सॉर्ट करेगा और उन्हें "लेखकों- transform.txt" फ़ाइल में रखेगा। अब फ़ाइल में प्रत्येक पंक्ति को संपादित करें। उदाहरण के लिए, परिवर्तित करें:

jwilkins = jwilkins <jwilkins>

इस मामले में:

jwilkins = John Albin Wilkins <[email protected]>

2. Git-svn का उपयोग कर सबवर्जन रिपॉजिटरी क्लोन करें

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

यह मानक जीआईटी-एसवीएन रूपांतरण (चरण 1 में आपके द्वारा बनाए गए लेखक-ट्रांसपोर्ट। टेस्ट फ़ाइल का उपयोग करके) करेगा और जीआईटी रिपॉजिटरी को अपनी होम डाइरेक्टरी में "~ / temp" फ़ोल्डर में रखें।

3. परिवर्तित करें svn: गुणों को अनदेखा करने के लिए .gitignore

यदि आपकी svn रेपो svn: ignore properties का उपयोग कर रहा था, तो आप इसे आसानी से एक .gitignore फ़ाइल में परिवर्तित कर सकते हैं:

cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

4. एक नंगे जीआईटी भंडार में रिपॉजिटरी को पुश करें

सबसे पहले, एक नंगे रेजॉजिटरी बनाएं और इसकी डिफ़ॉल्ट शाखा एसवीएन की "ट्रंक" शाखा का नाम बनाएं।

git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk

फिर टेम्पलेट रिपॉजिटरी को नया नंगे रिपॉजिटरी में दबाएं।

cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare

अब आप सुरक्षित ~ / temp रिपॉजिटरी को हटा सकते हैं

5. "मास्टर" को "ट्रंक" नाम बदलें

आपकी मुख्य विकास शाखा का नाम "ट्रंक" रखा जाएगा जो उपवर्सन में मौजूद नाम से मेल खाता है। आप इसका उपयोग करते हुए गीट के मानक "मास्टर" शाखा में उसका नाम बदलना चाहेंगे:

cd ~/new-bare.git
git branch -m trunk master

6. शाखाओं और टैग को साफ करें

जीआईटी-एसवीएन सबटाइवर टैग्स को "टैग / नाम" के रूप में गिट में बहुत-छोटी शाखाओं में बना देता है। आप उन सभी शाखाओं को वास्तविक गीट टैग में परिवर्तित करना चाहते हैं:

cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done

यह कदम थोड़ा टाइपिंग ले जाएगा। :-) लेकिन घबराना नहीं; आपका यूनिक्स शेल अतिरिक्त लंबी कमान के लिए एक> माध्यमिक संकेत प्रदान करेगा जो प्रत्येक-रेफरी के लिए जीआईटी के साथ शुरू होता है


के लिए GitLab उपयोगकर्ताओं मैं कैसे मैं SVN से यहां चले गए पर एक सार प्रस्तुत किया है:

https://gist.github.com/leftclickben/322b7a3042cbe97ed2af

कदम SVN से GitLab को विस्थापित करने के लिए

सेट अप

  • SVN पर होस्ट किया गया है svn.domain.com.au
  • SVN के माध्यम से पहुँचा जा सकता है http(अन्य प्रोटोकॉल काम करना चाहिए)।
  • GitLab पर होस्ट किया गया है git.domain.com.auऔर:
    • एक समूह नाम स्थान के साथ बनाई गई है dev-team
    • कम से कम एक उपयोगकर्ता खाता बनाने के बाद समूह में जोड़े गए, और खाते के लिए एक SSH कुंजी माइग्रेशन (परीक्षण का उपयोग कर के लिए इस्तेमाल किया जा रहा है ssh [email protected])।
    • परियोजना favourite-projectमें बनाई गई है dev-teamनाम स्थान।
  • फ़ाइल users.txtप्रासंगिक उपयोगकर्ता जानकारी, प्रति पंक्ति एक उपयोगकर्ता, फार्म के होते हैं username = First Last <[email protected]>, जहां usernameSVN लॉग में दिए गए उपयोगकर्ता नाम है। (उपयोगकर्ता केसी द्वारा जानकारी के लिए संदर्भ खंड में पहले लिंक, विशेष रूप से इस सवाल का जवाब में देखें)।

संस्करण

  • तोड़फोड़ संस्करण 1.6.17 (r1128011)
  • Git संस्करण 1.9.1
  • GitLab संस्करण 7.2.1 ff1633f
  • उबंटू सर्वर 14.04

आदेश

bash
git svn clone --stdlayout --no-metadata -A users.txt 
http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab [email protected]:dev-team/favourite-project.git
git push --set-upstream gitlab master

बस! GitLab वेब UI में परियोजना पृष्ठ पुनः लोड करें और आप सभी प्रतिबद्ध और फ़ाइलों को अब सूचीबद्ध देखेंगे।

टिप्पणियाँ

  • देखते हैं, तो अज्ञात उपयोगकर्ताओं, git svn cloneआदेश, बंद हो जाएगा जो मामले, अद्यतन में users.txt, cd favourite-projectऔर git svn fetchजहां यह बंद कर दिया से जारी रहेगा।
  • मानक trunk- tags- branchesSVN भंडार के लिए लेआउट की आवश्यकता है।
  • SVN यूआरएल को दिया git svn cloneआदेश के स्तर पर बंद हो जाता है ठीक उसके ऊपर trunk/, tags/और branches/
  • git svn cloneआदेश शीर्ष पर कुछ चेतावनी सहित उत्पादन, का एक बहुत पैदा करता है; मैं चेतावनी पर ध्यान नहीं दिया।

प्रभावी ढंग से सबवर्सन साथ Git का उपयोग कर Git-SVN करने के लिए एक सौम्य परिचय है। मौजूदा SVN खजाने के लिए, Git-SVN इस सुपर आसान बनाता है। आप एक नया भंडार शुरू कर रहे हैं, तो पहले उसे एक खाली SVN भंडार बनाने के लिए और फिर Git-svn की तुलना में यह विपरीत दिशा में जा रहा है का उपयोग करके आयात बेहद आसान है। तो SVN में आयात करने के लिए एक नया Git भंडार बनाना किया जा सकता है, लेकिन यह एक सा दर्द होता है, खासकर यदि उस Git के लिए नए हैं और इतिहास के लिए प्रतिबद्ध बनाए रखने की उम्मीद है।


विंडोज के लिए रूबी इंस्टॉलर डाउनलोड करें और इसके साथ नवीनतम संस्करण स्थापित। अपने पथ पर रूबी निष्पादनयोग्य जोड़ें।

  • svn2git स्थापित करें
  • प्रारंभ मेनू -> सभी कार्यक्रमों -> रूबी -> रूबी के साथ एक कमांड प्रॉम्प्ट शुरू
  • फिर "मणि स्थापित svn2git" और दर्ज टाइप

    सववर्सन रिपॉजिटरी माइग्रेट

  • एक रूबी कमांड प्रॉम्प्ट खोलें और निर्देशिका जहां फाइलों माइग्रेट करने के लिए कर रहे हैं करने के लिए जाना

    तब svn2git http: // [डोमेन नाम] / SVN / [भंडार जड़]

  • यह कुछ घंटे लग परियोजना विस्थापित करने के लिए Git करने के लिए परियोजना कोड आकार पर निर्भर करता सकता है।

  • यह बड़ा कदम Git भंडार संरचना का निर्माण नीचे वर्णित के रूप में में मदद करता है।

    SVN (/ Project_components) ट्रंक -> Git मास्टर SVN (/ Project_components) शाखाओं -> Git शाखाओं SVN (/ Project_components) टैग -> Git टैग

दूरस्थ भंडार बना सकते हैं और परिवर्तन धक्का।


मैंने गिट की शाखाओं में जीआईटी टैग और एसवीएन शाखाओं में एसटीवीएन टैग को परिवर्तित करने सहित जीआईटी में एसवीएन इन कन्वर्ट करने के लिए चरण गाइड ( यहां ) से एक कदम पोस्ट किया है।

लघु संस्करण:

1) एक विशिष्ट संशोधन संख्या से क्लोन svn। (संशोधन संख्या सबसे पुरानी होनी चाहिए जिसे आप माइग्रेट करना चाहते हैं)

git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame

2) एसवीएन डेटा प्राप्त करें यह कदम यह सबसे अधिक समय लेता है।

cd gitreponame
git svn fetch

दोहराने git svn बिना किसी त्रुटि के समाप्त होने तक प्राप्त करें

3) मास्टर शाखा अपडेट की गई

git svn rebase

4) संदर्भों की नकल करके एसवीएन शाखाओं से स्थानीय शाखाएं बनाएं

cp .git/refs/remotes/origin/* .git/refs/heads/

5) एसटीवीएन टैग को जीआईटी टैग में परिवर्तित करें

git for-each-ref refs/remotes/origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done

6) एक बेहतर स्थान पर गिथूब की तरह एक रिपॉजिटरी रखो

git remotes add newrepo [email protected]:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo

यदि आप अधिक विवरण चाहते हैं, तो मेरी पोस्ट पढ़ें या मुझसे पूछें।


यहाँ कई जवाब का उल्लेख https://github.com/nirvdrum/svn2git , लेकिन बड़े खजाने के लिए इस धीमी हो सकती है। मैं का उपयोग कर एक कोशिश थी https://github.com/svn-all-fast-export/svn2git बजाय जो बिल्कुल एक ही नाम के साथ एक उपकरण है लेकिन SVN से केडीई विस्थापित करने के लिए Git करने के लिए इस्तेमाल किया गया था।

थोड़ा और अधिक काम में सेट अप करने के लिए, लेकिन जब मेरे लिए रूपांतरण ही किया मिनट जहां अन्य स्क्रिप्ट घंटे बिताए ले लिया।


टैग और न ही शाखाओं के बिना इतिहास के साथ Git में परिवर्तित करने SVN submodule / फ़ोल्डर 'MyModule'।

SVN बनाए रखने सूची चरण 1 के बाद से ऊपर टिप्पणियों का उपयोग अनदेखी करने के लिए


वहाँ विभिन्न तरीकों इस लक्ष्य को प्राप्त करने के लिए कर रहे हैं। मैं उनमें से कुछ की कोशिश की और वास्तव में सिर्फ Git और SVN विंडोज ओएस पर स्थापित के साथ एक काम कर पाया है।

आवश्यक शर्तें:

  1. खिड़कियों पर Git (मैं इस एक का उपयोग किया है) https://git-scm.com/
  2. कंसोल उपकरण स्थापित svn (मैं कछुआ SVN का उपयोग किया है)
  3. अपने SVN भंडार की फ़ाइल डंप। svnadmin dump /path/to/repository > repo_name.svn_dump

अंतिम लक्ष्य को प्राप्त करने के लिए कदम (एक Git, सबसे पहले स्थानीय Git करने के लिए इतिहास के साथ सभी भंडार ले जाते हैं, तो दूरस्थ)

  1. खाली भंडार बनाएं निर्देशिका REPO_NAME_FOLDER में (कंसोल उपकरण या TortoiseSVN का उपयोग) cd REPO_NAME_PARENT_FOLDER, REPO_NAME_PARENT_FOLDER में dumpfile.dump डाल

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump इस कार्रवाई के लिए प्रतीक्षा करें, यह लंबे समय हो सकता है

  3. यह आदेश चुप है, तो खुला दूसरा cmd खिड़की है: svnserve -d -R --root REPO_NAME_FOLDER/// ......: क्यों बस का उपयोग नहीं फ़ाइल? अगले आदेश के साथ असफल हो जायेगी कारण Unable to open ... to URL:, जवाब के लिए धन्यवाद https://.com/a/6300968/4953065

  4. नया फ़ोल्डर SOURCE_GIT_FOLDER बनाएं

  5. cd SOURCE_GIT_FOLDER
  6. Git SVN क्लोन SVN: // स्थानीय होस्ट / इस कार्रवाई के लिए प्रतीक्षा करें।

अंत में, हम मिल गया क्या करते हैं?

हमारे स्थानीय भंडार की जांच की सुविधा देता है:

git log

अपने पिछले प्रतिबद्ध देखते हैं? यदि हाँ - ठीक है

तो अब आप अपने स्रोतों और पुराने SVN इतिहास के साथ पूरी तरह कार्यात्मक स्थानीय Git भंडार है। अब, आप कुछ सर्वर पर ले जाना चाहते हैं, निम्न कमांड का उपयोग करें:

git remote add origin https://fullurlpathtoyourrepo/reponame.git
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags

मेरे मामले में, मैं न टैग कमान कारण मेरी रेपो न टैग नहीं है की जरूरत है।

सौभाग्य!


Git के लिए SVN उपयोगकर्ताओं के मानचित्रण के लिए एक प्रयोक्ता फाइल (यानी users.txt ) बनाएँ:

user1 = First Last Name <[email protected]>
user2 = First Last Name <[email protected]>
...

आप अपने मौजूदा एसवीएन भंडार से टेम्पलेट बनाने के लिए इस एक-लाइनर का उपयोग कर सकते हैं:

svn log --xml | grep "<author>" | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = /' | tee users.txt

SVN बंद हो जाता है अगर उसे फ़ाइल में अनुपलब्ध एसवीएन उपयोगकर्ता नहीं मिलता है। लेकिन उसके बाद आप फ़ाइल को अपडेट कर सकते हैं और पिक-अप जहां आपने छोड़ा था।

अब एसवीएन डेटा को रिपॉजिटरी से खींचें:

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp

यह कमांड dest_dir-tmp में एक नया dest_dir-tmp भंडार dest_dir-tmp और एसवीएन रिपॉजिटरी को खींचना शुरू dest_dir-tmp । ध्यान दें कि "--stdlayout" ध्वज में आपके पास सामान्य "ट्रंक /, ब्रांच /, टैग / एसवीएन लेआउट है" यदि आपका लेआउट अलग है, तो - --tags , - --branches , - --trunk विकल्पों से परिचित हो --trunk (सामान्य git svn help )।

सभी सामान्य प्रोटोकॉल की अनुमति है: svn:// , http:// , https:// । URL को आधार रिपोजिटरी को लक्षित करना चाहिए, जैसे कुछ http://svn.mycompany.com/myrepo/repository /trunk , /tag या /branches शामिल नहीं करना चाहिए

ध्यान दें कि इस कमांड को निष्पादित करने के बाद यह अक्सर दिखता है कि ऑपरेशन "लटका / फ्रीज" है, और यह काफी सामान्य है कि यह नया भंडार शुरू करने के बाद लंबे समय तक फंस सकता है। अंततः आप लॉग संदेश देखेंगे जो इंगित करता है कि यह माइग्रेट हो रहा है।

यह भी ध्यान रखें कि यदि आप --no-metadata flag मिटा देते हैं, तो git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID> प्रतिबद्ध संदेश को संबंधित एसवीएन संशोधन के बारे में जानकारी देगा (यानी git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID> )

अगर कोई उपयोगकर्ता नाम नहीं मिला है, तो अपने users.txt फ़ाइल को अपडेट करें:

cd dest_dir-tmp
git svn fetch

यदि आपके पास एक बड़ी परियोजना है, तो उस सब कमांड को कई बार दोहराना पड़ सकता है, जब तक कि सभी सबवर्सन कमाने नहीं मिलते हैं।

git svn fetch

पूरा होने पर, गीट एसवीएन trunk को एक नई शाखा में चेक आउट करेगा। किसी भी अन्य शाखाएं रिमोट के रूप में स्थापित की जाती हैं। आप अन्य एसवीएन शाखाओं को देख सकते हैं:

git branch -r

यदि आप अपनी रिपॉजिटरी में अन्य दूरस्थ शाखाओं को रखना चाहते हैं, तो आप मैन्युअल रूप से प्रत्येक के लिए एक स्थानीय शाखा बनाना चाहते हैं। (ट्रंक / मास्टर छोड़ें।) यदि आप ऐसा नहीं करते हैं, तो शाखाओं को अंतिम चरण में क्लोन नहीं किया जाएगा।

git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name

टैग शाखाओं के रूप में आयात किए जाते हैं आपको एक स्थानीय शाखा बनाना है, एक टैग बनाएं और शाखा को हटा दें ताकि उन्हें गिट में टैग के रूप में रखा जा सके। टैग "v1" के साथ करने के लिए:

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

अपने जीआईटी-एसवीएन भंडार को क्लीन गीट भंडार में क्लोन करें:

git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir

स्थानीय शाखाएं जिन्हें आपने दूरस्थ शाखाओं से पहले बनाया था उन्हें केवल नए क्लोन रिपॉजिटरी में दूरस्थ शाखाओं के रूप में प्रतिलिपि किया गया होगा। (ट्रंक / मास्टर छोड़ें।) प्रत्येक शाखा के लिए जिसे आप रखना चाहते हैं:

git checkout -b local_branch origin/remote_branch

अंत में, अपने साफ Git रिपॉजिटरी से रिमोट को हटा दें जो अब हटाए गए अस्थायी भंडार को इंगित करता है:

git remote rm origin




git-svn