मैं इतिहास के साथ SVN रिपॉजिटरी को नए Git रिपॉजिटरी में कैसे स्थानांतरित करूं?


1509

मैंने Git मैन्युअल, FAQ, Git - SVN क्रैश कोर्स, आदि को पढ़ा और वे सभी इसे और यह बताते हैं, लेकिन कहीं भी आप एक सरल निर्देश पा सकते हैं जैसे:

एसवीएन भंडार: 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

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


6
यह आसान हो रहा है, मैंने इसे खुद पूरा किया और SO jmoses.co/2014/03/21/moving-from-svn-to-git.html
जॉन मूसा

नीचे दिए गए केसी के उत्तर का उपयोग करें, लेकिन इससे पहले कि आप "svn क्लोन ..." कमांड चलाएं, देखें कि अतिरिक्त "विज़ुअल SVN सर्वर" लाइन को अपने user.txt फ़ाइल में कैसे जोड़ा जाए ... यहाँ: stackoverflow.com/questions/8971208/ …
मैकगिवेर

1
इसके अलावा, यदि आपके पास "आपके GitHub प्रोफ़ाइल में ईमेल निजी विकल्प की जाँच की गई है, तो इसका उपयोग .xt से मेल करने के लिए usersxt में अपने ईमेल पते के रूप में करें। yourgituser@users.noreply.github.com, ताकि आपका वास्तविक ईमेल पता न चले।" कमिट्स पर।
MacGyver

जवाबों:


529

जादू:

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

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

$ git svn --help

139
@ कैसी के उत्तर से मूल प्रश्न का उत्तर बहुत बेहतर मिलता है।
डग विल्सन

3
क्या इससे शाखाएँ और सब कुछ बना रहेगा? या बस ट्रंक क्लोन?
एल्डोसा

7
@ एल्डोसा: यह सिर्फ ट्रंक को क्लोन करेगा। एक विकल्प के लिए केसी का जवाब देखें।
13

3
@DougWilson लेकिन मैं यहाँ किसी केसी का जवाब नहीं देख सकता। क्या यह 13 लेखकों के साथ नीचे का जवाब है जो "उपयोगकर्ता फ़ाइल बनाएँ" से शुरू होता है?
एंड्रे रीजेंटोव

67
किसी और के लिए, जो सोच रहा है कि "केसी का जवाब" जो कि यहां पर बहुत सारी टिप्पणियों में संदर्भित है, यह यह है (केसी ने अपने निक नेम को सेमीजिन्टी में बदल दिया)।
स्टीफन मोनोव

1559

users.txtGit करने के लिए SVN उपयोगकर्ताओं को मैप करने के लिए एक उपयोगकर्ता फ़ाइल (यानी ) बनाएं :

user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...

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

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

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

अब रिपॉजिटरी से SVN डेटा खींचें:

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

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

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

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

यह भी ध्यान दें कि यदि आप --no-metadataध्वज को छोड़ देते हैं , तो Git प्रतिबद्ध एसवीएन संशोधन के बारे में जानकारी को संदेश में भेज देगा (यानी 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

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

git branch -r

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

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

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

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

अपने GIT-SVN रिपॉजिटरी को एक साफ Git रिपॉजिटरी में क्लोन करें:

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

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

git checkout -b local_branch origin/remote_branch

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

git remote rm origin

36
Eelke का यह ब्लॉग पोस्ट उपरोक्त उत्तर के लिए एक महान क्रॉस-संदर्भ है। blokspeed.net/blog/2010/09/converting-from-subversion-to-git
kgriffs

4
यह 99% भयानक है, इन चरणों का पालन करते हुए, मुझे शाखाओं को छोड़कर सब कुछ मिला: अंतिम चरण के बाद, वे केवल दूरस्थ थे (और जैसे कि जब मैंने कमांड किया तो गायब हो गया: git दूरस्थ आरएम मूल)
डर्टी हेनरी

4
GitHub का एक बहुत ही सुविधाजनक चरण-दर-चरण है: github.com/nirvdrum/svn2git#readme
Dan Nissenbaum

8
विंडोज के तहत उन लोगों के लिए, मैंने इस पद्धति पर आधारित एक PowerShell स्क्रिप्ट बनाई: gist.github.com/Gimly/90df046dc38181bb18de
Gimly

5
बहुत सारे इतिहास के साथ बड़े रिपोज के लिए चेतावनी , यह धीमा और टेडियस है । मैंने सभी पुरानी शाखाओं को स्थानांतरित करने की कोशिश की और बस ट्रंक को स्थानांतरित कर दिया।
जेस

195

सफाई से अपने तोड़फोड़ रिपोजिटरी एक गिट रिपोजिटरी में माइग्रेट करें । सबसे पहले आपको एक फाइल बनानी होगी जो आपके सबवर्सन को कमिट करती है लेखक के नाम Git कमिटर्स को देते हैं, कहते हैं ~/authors.txt:

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>

तो फिर आप तोड़फोड़ डेटा को जीआईटी रिपॉजिटरी में डाउनलोड कर सकते हैं:

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

यदि आप एक मैक पर हैं, तो आप git-svnइंस्टॉल करके MacPorts से प्राप्त कर सकते हैं git-core +svn

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

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

1
जैसा कि मैंने अन्य उत्तर पर टिप्पणी की, मैं चारों ओर रिक्त स्थान को दूर करने के लिए किया था =में users.txtक्योंकि आयात निरस्त किया जा रहा था और मैं एक खाली भंडार हो रही थी।
सेबेस्टियन ग्रिग्नोली

8
आह! सरल और प्रभावी व्याख्या। मेरे मामले में मैंने file:///काम करने से इनकार कर दिया, बस मैंने उसका इस्तेमाल किया svnserve.exe --daemonऔर उसके svn://localhost/home/user/repoबजाय इस्तेमाल किया।
डैनियल रीस

मेरे मैक पर माउंटेन लायन चल रहा है, git svn तब तक काम नहीं करेगा जब तक कि मैं Xcode में नहीं गया और कमांड लाइन टूल्स को प्राथमिकता फलक के डाउनलोड टैब में पाया। वैकल्पिक रूप से, मैं Apple के डेवलपर साइट पर पाए जाने वाले OS X Mountain Lion के लिए सिर्फ कमांड लाइन टूल स्थापित कर सकता था।
आकर्षित किया

3
मेरे मामले के लिए मुझे फ़ाइल authors.txtको रूपांतरित करना था utf-8 without BOM
सिल्वन

यह मेरे लिए बहुत अच्छा काम किया! एक बार मैं स्थानीय भंडार था, मैं से शुरू cmcginty पद का इस्तेमाल किया "क्लोन एक साफ Git भंडार में अपना Git-SVN भंडार:" मुझे लगता है कि मुख्य कारण मैं इसे पसंद किया @zoul के जवाब था का प्रयोग होता है git svn init, git svn configतो अंत में git svn fetchके रूप में यह आसान था इसे इस तरह से करने के लिए, मुझे इसे सही करने के लिए कई बार लाना पड़ा। cmcginty की सिंगल-लाइन git svn clone, जो कि तीनों करती है, मेरे लिए बहुत मुश्किल थी।
माइक

70

मैंने svn2git स्क्रिप्ट का उपयोग किया और एक आकर्षण की तरह काम करता है।


4
प्रश्न: टैग और शाखा नामों (svn में अनुमति नहीं है और गिट में अनुमति नहीं) में इस स्थान को ठीक करता है?
स्पजम

2
इसका उपयोग करने के लिए यह मार्गदर्शिका सहायक है: troyhunt.com/2014/08/migrating-from-subversion-to-git-with.html
मोर्टेन होल्मगार्ड

यह मेरे लिए एक समस्या के साथ विफल रहा: group.google.com/forum/# ​​.topic / msysgit / 7MQVwRO - 2N4 - यह भी देखें: github.com/nirvdrum/svn2git/issues/50 यहाँ समाधान था stackoverflow.com/questions / ३००
16३

उत्तर की व्याख्या करना बेहतर है अन्यथा हम स्क्रिप्ट किडिज़ का निर्माण करते हैं।
जोश हब्दास

यदि आपकी शाखाएं एसवीएन की जड़ में हैं और आपके पास कोई ट्रंक या टैग नहीं है तो क्या होगा?
काल

58

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

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

स्थानीय रेपो को प्रारंभ करें:

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

संशोधन आयात करना शुरू करने के लिए आप कितनी दूर तक मार्क करते हैं:

git svn fetch -r42

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

वास्तव में तब से सब कुछ लाने के लिए:

git svn rebase

आप Gitk के साथ आयात के परिणाम की जांच कर सकते हैं। मुझे यकीन नहीं है कि अगर यह विंडोज पर काम करता है, तो यह ओएसएक्स और लिनक्स पर काम करता है:

gitk

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

पहले अपना खाली रिमोट रेपो बनाएं (शायद गिटहब पर ?):

git remote add origin git@github.com:user/project-name.git

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

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

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

पहली व्याख्यात्मक पोस्ट: " Git दूरस्थ शाखाएँ "

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


बेहद मददगार, इसने पूरी तरह से काम किया। मुझे लगता है कि अगर आप एक दूरस्थ भंडार के लिए synching हैं लेने के लिए एक अंतिम कदम है। Git config स्टेप्स के बाद, मुझे git push origin master
mag382

31

तोड़फोड़ से जीआईटी (या एक साथ दोनों का उपयोग करने के लिए) के लिए एक आसान समाधान है: सबजीट

मैं खुद इस प्रोजेक्ट पर काम कर रहा हूं। हम अपने रिपॉजिटरी में सबजीट का उपयोग करते हैं - मेरे कुछ साथी गैट और कुछ तोड़फोड़ का उपयोग करते हैं और अब तक यह बहुत अच्छी तरह से काम करता है।

सबजीट के साथ सबविटर से गिट में माइग्रेट करने के लिए आपको चलाने की जरूरत है:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

उसके बाद आप svn_repos / .it में Git रिपॉजिटरी प्राप्त करेंगे और इसे क्लोन कर सकते हैं, या बस Subversion और इस नए Git रिपॉजिटरी का एक साथ उपयोग करना जारी रखेंगे: SubGit यह सुनिश्चित करेगा कि दोनों को हमेशा सिंक में रखा जाए।

यदि आपकी सबवर्सन रिपॉजिटरी में कई परियोजनाएँ हैं, तो svn_repos / gb निर्देशिका में कई Git रिपोजिटरी बनाई जाएँगी। निम्नलिखित को करने से पहले अनुवाद को अनुकूलित करने के लिए:

$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos

सबजीत के साथ आप शुद्ध Git (git-svn नहीं) में माइग्रेट कर सकते हैं और तब भी इसका उपयोग करना शुरू कर सकते हैं जब तक आपको जरूरत है तब तक Subversion को बनाए रखना (उदाहरण के लिए आपके पहले से कॉन्फ़िगर किए गए बिल्ड टूल्स के लिए)।

उम्मीद है की यह मदद करेगा!


4
ध्यान दें कि एक बार आयात ( subgit importकमांड का उपयोग करके ) को लाइसेंस की आवश्यकता भी नहीं लगती है। फाइलों में svn:ignoreसंपत्ति का सटीक अनुवाद .gitignoreभी शामिल है।
krlmlr

1
सबजीत मेरी निजी कुंजी को नहीं पहचानता, और न ही किसी भी झंडे को जो मैंने कमांड लाइन में स्थापित किया था। प्रलेखन बहुत खराब है। यह एक व्यवहार्य विकल्प नहीं है git svn
pfnuesel

1
त्रुटि: 'svn_repos' एक मान्य कॉन्फ़िगर स्थान नहीं है; सबगेट कॉन्फ़िगरेशन फ़ाइल अनुपलब्ध है।
जॉन डेविस

19

आधिकारिक git-svn मैनपेज देखें । विशेष रूप से, "मूल उदाहरण" के अंतर्गत देखें:

संपूर्ण तोड़फोड़-प्रबंधित परियोजना में ट्रैकिंग और योगदान (एक ट्रंक, टैग और शाखाओं के साथ पूरा):

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags

आपकी क्लोन कमांड ने काम किया, ऊपर वालों ने मुझे कुछ नहीं दिया और खाली गिट रिपोज किया। एकमात्र अंतर स्पष्ट 'टी ट्रंक' प्रतीत होता है।
user1984717 1


14

सबजीत (मृत्यु की ब्लू स्क्रीन)

subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

यह सब है।

+ SVN से अपडेट करने के लिए, पहले कमांड द्वारा बनाया गया Git रिपॉजिटरी।

subgit import  directory/path/Local.git.Repo

मैंने एक विशाल भंडार के लिए तुरंत Git में प्रवास करने का एक तरीका इस्तेमाल किया।
बेशक आपको कुछ तैयारी की आवश्यकता है।
लेकिन आप विकास प्रक्रिया को बिल्कुल भी नहीं रोक सकते।

यहाँ मेरा रास्ता है।

मेरा समाधान इस तरह दिखता है:

  • SVN को Git रिपॉजिटरी में माइग्रेट करें
  • टीम के स्विच करने से ठीक पहले Git रिपॉजिटरी को अपडेट करें

बड़े SVN रिपॉजिटरी के लिए माइग्रेशन में बहुत समय लगता है।
लेकिन केवल कुछ सेकंड में पूर्ण प्रवास का अद्यतन।

बेशक मैं सबजीत , मामा का उपयोग कर रहा हूं । git-svn मुझे मौत का ब्लू स्क्रीन बनाता है । बस लगातार। और git-svn मुझे Git के " फ़ाइलनाम बहुत लंबे " घातक त्रुटि के साथ बोर कर रहा है ।

कदम

1. सबजीत को डाउनलोड करें

2. माइग्रेट और अद्यतन कमांड तैयार करें।

मान लें कि हम इसे विंडोज के लिए करते हैं (यह लिनक्स में पोर्ट करने के लिए मामूली है)।
सबजीट की इंस्टॉलेशन बिन डायरेक्टरी (सबजिट-2.XX \ bin) में, दो .bat फाइलें बनाएं।

माइग्रेशन के लिए फ़ाइल / कमांड की सामग्री:

start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

"स्टार्ट" कमांड यहां (विंडोज) वैकल्पिक है। यह शुरू होने पर त्रुटियों को देखने की अनुमति देगा और सबजीट के पूरा होने के बाद खोले गए एक खोल को छोड़ देगा।

आप यहाँ git-svn के समान अतिरिक्त पैरामीटर जोड़ सकते हैं । मैं SVN लेखकों के ईमेल पते के डोमेन को ठीक करने के लिए केवल --default-domain myCompanyDomain.com का उपयोग कर रहा हूं ।
मेरे पास मानक एसवीएन रिपॉजिटरी की संरचना (ट्रंक / शाखाएं / टैग) हैं और हमें "लेखक मैपिंग" से कोई परेशानी नहीं है। इसलिए मैं और कुछ नहीं कर रहा हूं।

(यदि आप शाखाओं की तरह टैगों को माइग्रेट करना चाहते हैं या आपके SVN के पास कई शाखाएँ / टैग फ़ोल्डर हैं जिन्हें आप अधिक वर्बोज़ सबगिट दृष्टिकोण का उपयोग करने के लिए विचार कर सकते हैं )

टिप 1 : उपयोग करें - न्यूनतम संशोधन YourSvnRevNumber यह देखने के लिए कि चीजें कैसे उबलती हैं (कुछ प्रकार की डिबगिंग)। विशेष रूप से उपयोगी हल लेखक नाम या ईमेल देखने के लिए है।
या माइग्रेशन हिस्ट्री की गहराई को सीमित करने के लिए।

टिप 2 : माइग्रेशन बाधित हो सकता है ( Ctrl+ C) और अगले अद्यतन कमांड / फ़ाइल को चलाकर बहाल किया जा सकता है ।
मैं बड़ी रिपॉजिटरी के लिए ऐसा करने की सलाह नहीं देता। मुझे "मेमोरी ऑफ़ जावा + विंडोज अपवाद" मिला है।

टिप 3 : अपने परिणाम की प्रतिलिपि बनाने के लिए बेहतर है नंगे भंडार।

अद्यतन करने के लिए फ़ाइल / कमांड की सामग्री:

start    subgit import  directory/path/Local.git.Repo

आप इसे किसी भी समय चला सकते हैं, जब आप अपने गिट रिपॉजिटरी में अंतिम टीम के कमिट्स प्राप्त करना चाहते हैं।

चेतावनी! अपने नंगे भंडार (उदाहरण के लिए शाखाओं का निर्माण) को स्पर्श न करें।
आप अगली घातक त्रुटि लेंगे:

अपरिवर्तनीय त्रुटि: सिंक से बाहर हैं और समन्‍वयित नहीं किया जा सकता है ... तोड़फोड़ संशोधन को Git के लिए संशोधित करता है ...

3. पहला कमांड / फ़ाइल चलाएँ। यह एक बड़ा भंडार के लिए एक loooong समय लगेगा। मेरे विनम्र भंडार के लिए 30 घंटे।

यह सब है।
आप दूसरी फ़ाइल / कमांड चलाकर किसी भी समय किसी भी समय SVN से अपने Git रिपॉजिटरी को अपडेट कर सकते हैं। और अपनी विकास टीम को Git में स्विच करने से पहले।
यह सिर्फ कुछ सेकंड लगेगा।



एक और उपयोगी कार्य है।

अपने स्थानीय Git रिपॉजिटरी को दूरस्थ Git रिपॉजिटरी में पुश करें

क्या यह आपका मामला है? आगे बढ़ते हैं।

  1. अपने रिमोट को कॉन्फ़िगर करें

Daud:

$ git remote add origin url://your/repo.git
  1. एक दूरस्थ रिपॉजिटरी में अपने विशाल स्थानीय गिट भंडार के प्रारंभिक भेजने के लिए तैयार करें

डिफ़ॉल्ट रूप से आपका गिट बड़ा हिस्सा नहीं भेज सकता है। घातक: दूरस्थ अंत अप्रत्याशित रूप से लटका हुआ है

चलो इसके लिए चलते हैं:

git config --global http.postBuffer 1073741824

524288000 - 500 एमबी 1073741824 - 1 जीबी, आदि।

अपनी स्थानीय प्रमाणपत्र समस्याओं को ठीक करें । यदि आपका गिट-सर्वर टूटे हुए प्रमाण पत्र का उपयोग करता है।

मेरे पास सर्टिफिकेट है

इसके अलावा आपके Git सर्वर में अनुरोध राशि सीमाएँ हो सकती हैं जिन्हें ठीक करने की आवश्यकता है

  1. टीम के दूरस्थ गिट रिपॉजिटरी में सभी प्रवास पुश करें

स्थानीय Git के साथ चलाएं:

git push origin --mirror

(पुराने पुश संस्करणों के लिए git पुश ओरिजिन '*: *' )

यदि आपको निम्न मिलता है: त्रुटि: git को स्पेंट नहीं कर सकता: ऐसी कोई फ़ाइल या निर्देशिका नहीं ... मेरे लिए मेरे रिपॉजिटरी का पूर्ण मनोरंजन इस त्रुटि (30 घंटे) को हल करता है। आप अगले आदेशों की कोशिश कर सकते हैं

git push origin --all
git push origin --tags

या Git को पुन: स्थापित करने का प्रयास करें ( मेरे लिए बेकार )। या आप सभी टैग से शाखाएँ बना सकते हैं और उन्हें धक्का दे सकते हैं। या, या, या ...


10

reposurgeon

जटिल मामलों के लिए, एरिक एस। रेमंड द्वारा पुनर्खरीद पसंद का उपकरण है। एसवीएन के अलावा, यह fast-exportप्रारूप के माध्यम से कई अन्य संस्करण नियंत्रण प्रणालियों का समर्थन करता है , और सीवीएस भी । लेखक प्राचीन रिपॉजिटरी जैसे Emacs के सफल रूपांतरणों की रिपोर्ट करता है और FreeBSD के

उपकरण स्पष्ट रूप से पूर्ण रूपांतरण के निकट होता है (जैसे कि SVN को परिवर्तित करनाsvn:ignore गुणों को .gitignoreफ़ाइलों करना ) के पास एक लंबे इतिहास के साथ कठिन रिपॉजिटरी लेआउट के लिए भी है। कई मामलों के लिए, अन्य उपकरणों का उपयोग करना आसान हो सकता है।

reposurgeonकमांड लाइन के प्रलेखन में देरी करने से पहले , उत्कृष्ट डीवीसीएस माइग्रेशन गाइड को पढ़ना सुनिश्चित करें जो कि रूपांतरण प्रक्रिया चरण दर चरण आगे बढ़ती है।


8

एटलसियन की वेबसाइट पर यह मार्गदर्शिका मेरे द्वारा खोजे गए सर्वश्रेष्ठ में से एक है:

https://www.atlassian.com/git/migration

यह टूल - https://bitbucket.org/atlassian/svn-migration-scripts - अन्य चीजों के बीच अपने लेखकों को पैदा करने के लिए भी बहुत उपयोगी है।


यह पृष्ठ अद्भुत है, और IMHO सबसे अच्छा जवाब है! यह आपके लिए सबसे अधिक गंभीर काम करता है।
PfunnyGuy

8

आपको इंस्टाल करना है

git
git-svn

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

1. सभी तोड़फोड़ करने वालों की एक सूची प्राप्त करें

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

अपने स्थानीय तोड़फोड़ चेकआउट की जड़ से, इस कमांड को चलाएं:

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

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

jwilkins = jwilkins <jwilkins>

इस मामले में:

jwilkins = John Albin Wilkins <johnalbin@example.com>

2. git-svn का उपयोग करके तोड़फोड़ भंडार का क्लोन

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

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

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

यदि आपका svn रेपो svn का उपयोग कर रहा था: गुणों को अनदेखा करें, तो आप आसानी से इसे .itignore फ़ाइल का उपयोग करके परिवर्तित कर सकते हैं:

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

4. एक नंगे गिट भंडार में पुश भंडार

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

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

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

5. "मास्टर" को "ट्रंक" शाखा का नाम दें

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

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

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

git-svn सभी "" टैग्स / नाम के फॉर्म के Git में बहुत-छोटी शाखाओं में सबस्टेशन के टैग बनाता है। आप उन सभी शाखाओं को वास्तविक Git टैग में परिवर्तित करना चाहते हैं:

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

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


7

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


3
GitHub की वर्तमान अनुशंसा एक अन्य उत्तरsvn2git में सुझाए गए कार्यक्रम का उपयोग करने के लिए है ।
ntc2

अभी काफी त्रुटिपूर्ण दो बड़ी परियोजनाओं का आयात किया। सभी SVN शाखाओं को आयात किया गया (बस रेपो पथ में \ trunk भाग का उपयोग न करें) याद रखें। एक बात जो मुझे अभी तक पता नहीं है वह यह है कि क्या जीथब नए कमिट को ट्रैक करेगा या नहीं।
Fr0sT

7

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

अलग-अलग लोगों के लिए अपना SVN रेपो स्कैन करने और योगदान करने के लिए और मैपिंग फ़ाइल के लिए एक टेम्प्लेट उत्पन्न करने के लिए पहले इस bash स्क्रिप्ट का उपयोग करें:

#!/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 <USER@DOMAIN>";
done

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

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

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

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

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

git svn rebase --continue

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

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

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

चलाने के बाद

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

ध्यान दें कि इसके लिए 1.7 या उससे अधिक की आवश्यकता है।


मैं इस जानकारी को इस लिंक के साथ जोड़ना चाहूंगा
PS PS

7

मैंने gn शाखाओं में git टैग और svn शाखाओं में gn svn टैग्स को परिवर्तित करने के लिए svn में बदलने के लिए चरण मार्गदर्शिका ( यहाँ ) द्वारा एक कदम पोस्ट किया है ।

लघु संस्करण:

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

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

2) svn डेटा लाना। यह कदम यह सबसे अधिक समय लेता है।

cd gitreponame
git svn fetch

त्रुटि के बिना खत्म होने तक git svn को दोहराएं

3) मास्टर ब्रांच को अपडेट करवाएं

git svn rebase

4) संदर्भों की प्रतिलिपि बनाकर svn शाखाओं से स्थानीय शाखाएँ बनाएँ

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

5) svn टैग्स को git टैग्स में बदलें

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 git@github.com:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo

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


6

हम git svn cloneनीचे दिए गए आदेशों का उपयोग कर सकते हैं ।

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

एसवीएन कमिट्स के ऊपर लेखक कमांड फाइल बनाएगा।

  • svn log --stop-on-copy <SVN_URL>

जब आपका SVN प्रोजेक्ट बन जाता है तो ऊपर का कमांड आपको पहला संशोधन नंबर देगा।

  • git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>

ऊपर कमांड स्थानीय में गिट रिपॉजिटरी बनाएगा।

समस्या यह है कि यह पुश करने के लिए शाखाओं और टैग को परिवर्तित नहीं करेगा। आपको उन्हें मैन्युअल रूप से करना होगा। उदाहरण के लिए नीचे शाखाओं के लिए:

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
* master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$$ git checkout -b MyDevBranch origin/MyDevBranch
Branch MyDevBranch set up to track remote branch MyDevBranch from origin.
Switched to a new branch 'MyDevBranch'
$ git branch -a
* MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$

टैग के लिए:

$git checkout origin/tags/MyDevBranch-1.0
Note: checking out 'origin/tags/MyDevBranch-1.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 3041d81... Creating a tag
$ git branch -a
* (detached from origin/tags/MyDevBranch-1.0)
  MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$ git tag -a MyDevBranch-1.0 -m "creating tag"
$git tag
MyDevBranch-1.0
$

अब मास्टर, शाखाओं और टैग को दूरस्थ गिट रिपॉजिटरी में धकेलें।

$ git push origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
 * [new branch]      master -> master
 * [new branch]      MyDevBranch -> MyDevBranch
 * [new tag]         MyDevBranch-1.0 -> MyDevBranch-1.0
$

svn2it उपयोगिता

svn2git उपयोगिता शाखाओं और टैग के साथ मैन्युअल प्रयासों को हटा देती है।

कमांड का उपयोग करके इसे स्थापित करें sudo gem install svn2git। उसके बाद कमांड के नीचे चलाएं।

  • $ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>

अब आप शाखाओं, टैगों को सूचीबद्ध कर सकते हैं और उन्हें आसानी से धक्का दे सकते हैं।

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
  MyDevBranch
* master
  remotes/svn/MyDevBranch
  remotes/svn/trunk
$ git tag
  MyDevBranch-1.0
$ git push origin master MyDevBranch MyDevBranch-1.0

कल्पना कीजिए कि आपके पास 20 शाखाएँ और टैग हैं, जाहिर है कि svn2git आपको बहुत समय बचाएगा और इसलिए मुझे यह देशी कमांड्स से बेहतर लगता है। यह देशी git svn cloneकमांड के आसपास एक अच्छा आवरण है ।

एक पूर्ण उदाहरण के लिए, मेरे ब्लॉग प्रविष्टि का संदर्भ लें ।


5

TortoiseGit ऐसा करता है। इस ब्लॉग पोस्ट को देखें: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients

हाँ, मुझे पता है कि लिंक के साथ जवाब देना शानदार नहीं है, लेकिन यह एक समाधान है, एह?


आर्काइव.ऑर्ग पर वेकबैक मशीन आज़माएं
सीएडी

3

मैं केवल मेरे द्वारा खोजे गए इस लघु श्रृंखला की सिफारिश करता हूं। लेखक आपको मूल संचालन के माध्यम से चलता है, और कुछ और उन्नत उपयोग दिखाता है।


3

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

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

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

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

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


शुक्रिया, सुपरसी और फास्ट!
रिकर्ड

धन्यवाद। इसने मेरे लिए काम किया। मैं SourceTree और Stash का उपयोग कर रहा हूं।
VK_217

3

के लिये 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 git@git.domain.com.au )।
    • प्रोजेक्ट नेमस्पेस favourite-projectमें बनाया गया dev-teamहै।
  • फ़ाइल users.txtमें संबंधित उपयोगकर्ता विवरण, प्रति पंक्ति एक उपयोगकर्ता प्रपत्र username = First Last <address@domain.com.au>, जहाँ 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 git@git.domain.com.au:dev-team/favourite-project.git
git push --set-upstream gitlab master

बस! GitLab वेब UI में प्रोजेक्ट पेज को फिर से लोड करें और अब सूचीबद्ध सभी कमिट और फाइल देखेंगे।

टिप्पणियाँ

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

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं।
ब्लैकहोल

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

2

एक और के रूप में, गिट-स्क्वैश कमांड एक गॉडसेंड है जब गिट-स्वन डैमिट्स के साथ गिट की कोशिश की जाती है।

एक सामान्य प्रक्रिया:

  1. git रेपो सेट करें
  2. कुछ काम अलग-अलग फाइलों पर करें
  3. git का उपयोग करते हुए कुछ कार्यों को जांचने का निर्णय लें
  4. करने का फैसला svn-dcommit
  5. घबरा जाना "एक गंदे सूचकांक के साथ प्रतिबद्ध नहीं कर सकता" त्रुटि।

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

git stash; git svn dcommit ; git stash apply

2

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

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

स्क्रिप्ट की लगभग 30 पंक्तियों में: git SVN का उपयोग करते हुए क्लोन, SVN से एक .itignore फ़ाइल बनाता है :: गुणों को अनदेखा करें, नंगे git रिपॉजिटरी में धकेलता है, SVN ट्रंक को मास्टर में बदल देता है, SVN टैग को git टैग में कनवर्ट करता है, और इसे GitHub में धकेलता है टैग को संरक्षित करते हुए।

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

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


2
मैंने इस स्क्रिप्ट का इस्तेमाल किया। थोड़ी सी राह और त्रुटि के बाद, इसने मेरे लिए काम किया। कृपया सलाह दी जाती है कि आपको इसके लिए Git 1.8.3+ की आवश्यकता है , क्योंकि - इसके बाद के टैग केवल समर्थित हैं।
nrobey

2

मैं एक विंडोज़ मशीन पर हूँ और एक छोटे बैच को इतिहास के साथ एसवीएन रेपो (केवल शाखाओं के बिना) को जीआईटी रेपो में स्थानांतरित करने के लिए बनाया

transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo

शायद कोई भी इसका उपयोग कर सकता है। यह एक टीएमपी-फोल्डर बनाता है जो एसवीएन रेपो को जीआईटी के साथ जांचता है और नए मूल को जोड़ता है और इसे पुश करता है ... और फ़ोल्डर को फिर से हटा देता है।

@echo off 
SET FROM=%1 
SET TO=%2 
SET TMP=tmp_%random%

echo from:  %FROM% 
echo to:    %TO% 
echo tmp:   %TMP%

pause

git svn clone  --no-metadata --authors-file=users.txt %FROM% %TMP%  
cd %TMP% 
git remote add origin %TO% 
git push --set-upstream origin master


cd .. 
echo delete %TMP% ... 
pause

rmdir /s /q %TMP%

आपको अभी भी अपने उपयोगकर्ता-मैपिंग जैसे यूजर्स की जरूरत है

User1 = User One <u.1@xxx.com>

इस जवाब ने मुझे अपनी सभी रिपॉजिटरी को बिना किसी समस्या के बिटकॉइन में स्थानांतरित करने में मदद की।
गोंजालिंगुई

सुनकर खुशी हुई। मुझे केवल गीता के साथ ही अनुभव था ... लेकिन इस तरह से ~~ 40 रेपोसेड।
cljk

बहुत अच्छा! Thnx
b3wii

चेतावनी; मुझे खराब चारसेट मुद्दों का अनुभव हुआ। मैंने इसे वास्तव में बहुत देर से पहचाना लेकिन मुझे कई घंटे लग गए। कृपया जाँच लें कि आपके परिणामी रेपो में
cljk

1

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

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 .

0

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


0

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

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

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

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

    फिर svn2git http: // [डोमेन नाम] / svn / [रिपॉजिटरी रूट]

  • Git को प्रोजेक्ट माइग्रेट करने में कुछ घंटे लग सकते हैं, प्रोजेक्ट कोड साइज़ पर निर्भर करता है।

  • यह प्रमुख कदम नीचे वर्णित के रूप में गिट रिपॉजिटरी संरचना बनाने में मदद करता है।

    एसवीएन (/ प्रोजेक्ट_काउंटर) ट्रंक -> गिट मास्टर एसवीएन (/ प्रोजेक्ट_काउंटर) शाखाएँ -> गिट शाखाएं एसवीएन (/ प्रोजेक्ट_कॉर्पोरेटर्स) टैग -> गिट टैग

दूरस्थ रिपॉजिटरी बनाएँ और परिवर्तनों को आगे बढ़ाएँ।


0

GitHub का एक आयातक है। एक बार रिपॉजिटरी बनाने के बाद, आप किसी मौजूदा रिपॉजिटरी से इसके URL के माध्यम से आयात कर सकते हैं। यह आपके क्रेडेंशियल्स के लिए पूछेगा यदि लागू हो और वहां से जाएं।

जैसा कि यह चल रहा है यह लेखकों को मिलेगा, और आप बस उन्हें GitHub पर उपयोगकर्ताओं को मैप कर सकते हैं।

मैंने अब कुछ रिपॉजिटरी के लिए इसका उपयोग किया है, और यह बहुत सटीक है और बहुत तेज है! ~ 4000 कमिट के साथ एक रिपॉजिटरी के लिए 10 मिनट का समय लगा, और इसके बाद मेरे दोस्त को चार दिन लग गए!


0

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

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


0

इस लक्ष्य को प्राप्त करने के लिए विभिन्न विधियाँ हैं। मैं उनमें से कुछ की कोशिश की है और वास्तव में बस ओएस पर स्थापित 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, REP_NAME_PARENT_FOLDER में डंपफाइल.dump डालें

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

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

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

  5. cd SOURCE_GIT_FOLDER
  6. git svn क्लोन क्लोन svn: // localhost / इस ऑपरेशन के लिए प्रतीक्षा करें।

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

हमारे स्थानीय भंडार की जाँच करें:

git log

अपने पिछले कमिट्स देखें? यदि हाँ - ठीक है

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

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

मेरे मामले में, मुझे टैग की आवश्यकता नहीं है क्योंकि मेरे रेपो में टैग नहीं हैं।

सौभाग्य!


0

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.