एक मौजूदा गिट रिपॉजिटरी को एसवीएन को धक्का देना


384

मैं अपना सारा काम Git में कर रहा हूं और GitHub को धकेल रहा हूं। मैं सॉफ्टवेयर और साइट दोनों से बहुत खुश हूं, और मुझे इस बिंदु पर अपने काम करने के तरीकों को बदलने की कोई इच्छा नहीं है।

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

मैं तब उस एसवीएन रिपॉजिटरी को चुनने के लिए एक दो कमांड चलाना चाहता हूं, जब मैं चुनता हूं। मैं Git का उपयोग करते रहना चाहता हूं और सिर्फ SVN रिपॉजिटरी मिरर है जो Git में है।

मैं कभी भी एसवीएन के लिए प्रतिबद्ध होने वाला एकमात्र व्यक्ति होगा, अगर इससे कोई फर्क पड़ता है।


1
ध्यान दें: जब आप ऐसा करते हैं तो आप शायद अपनी मूल तिथि-टिकट खो देंगे। नई तिथियां आयात के समय तोड़फोड़ के आधार पर होंगी।
नोबार

अधिक वर्तमान जानकारी की तलाश में कुछ लोगों को स्वचालन के लिए अपनी खोज के दौरान निम्नलिखित पोस्ट उपयोगी मिल सकती है: स्वादिष्ट
बीजों का सेवन-डंपिंग-वर्डप्रेस-plugins-travis

जवाबों:


402

मुझे इसकी भी आवश्यकता थी, और बॉम्बे के उत्तर की मदद से + आसपास कुछ गड़बड़, मुझे यह काम कर गया। यहाँ नुस्खा है:

आयात गिट -> तोड़फोड़

1. cd /path/to/git/localrepo
2. svn mkdir --parents protocol:///path/to/repo/PROJECT/trunk -m "Importing git repo"
3. git svn init protocol:///path/to/repo/PROJECT -s
4. git svn fetch
5. git rebase origin/trunk
5.1.  git status
5.2.  git add (conflicted-files)
5.3.  git rebase --continue
5.4.  (repeat 5.1.)
6. git svn dcommit

# 3 के बाद आप इस तरह एक गुप्त संदेश मिलेगा:

URL के उच्च स्तर का उपयोग करना: protocol:///path/to/repo/PROJECT => protocol:///path/to/repo

बस उस पर ध्यान न दें।

जब आप # 5 चलाते हैं, तो आपको विरोध हो सकता है । राज्य "अनमैरिड" के साथ फाइलें जोड़कर और रिब्यूस को फिर से शुरू करके इन्हें हल करें। आखिरकार, तुम हो जाओगे; तो SVN भंडार करने के लिए सिंक वापस, का उपयोग करते हुए dcommit। बस इतना ही।

रिपॉजिटरी को सिंक में रखते हुए

अब आप निम्न आदेशों का उपयोग करके SVN से Git तक सिंक्रनाइज़ कर सकते हैं:

git svn fetch
git rebase trunk

और Git से SVN तक सिंक्रनाइज़ करने के लिए, उपयोग करें:

git svn dcommit

अंतिम नोट

लाइव रिपॉजिटरी में आवेदन करने से पहले आप इसे स्थानीय कॉपी पर आज़मा सकते हैं। आप एक अस्थायी जगह पर अपने गिट रिपॉजिटरी की एक प्रति बना सकते हैं; बस उपयोग करें cp -r, क्योंकि सभी डेटा भंडार में ही है। तब आप एक फ़ाइल-आधारित परीक्षण भंडार स्थापित कर सकते हैं,

svnadmin create /home/name/tmp/test-repo

और वर्किंग कॉपी की जाँच करें,

svn co file:///home/name/tmp/test-repo svn-working-copy

यह आपको किसी भी स्थायी परिवर्तन करने से पहले चीजों के साथ खेलने की अनुमति देगा।

परिशिष्ट: यदि आप गड़बड़ करते हैं git svn init

यदि आप गलती git svn initसे गलत URL के साथ चलते हैं, और आप अपने काम का बैकअप लेने के लिए पर्याप्त स्मार्ट नहीं थे (पूछें नहीं ...), तो आप केवल उसी कमांड को फिर से नहीं चला सकते हैं। हालाँकि आप जारी करके परिवर्तनों को पूर्ववत कर सकते हैं:

rm -rf .git/svn
edit .git/config

और सेक्शन [svn-remote "svn"]सेक्शन को हटा दें ।

फिर आप git svn initनए सिरे से चला सकते हैं ।


2
अच्छा उत्तर। क्या इससे कमिट डेट्स भी गड़बड़ होती हैं?
ड्रू नोकस जू

4
अच्छे प्रश्न - दुर्भाग्य से, मुझे इसका उत्तर नहीं पता है। यह काम करने के लिए मुझे जो मिला, उसका अधिक व्यावहारिक मार्गदर्शक है। मैं पूरी तरह से सभी विवरणों को नहीं समझता। प्रतिबद्धताओं के बारे में, मुझे लगता है कि आप एक परीक्षण कर सकते हैं और पता लगा सकते हैं। याद रखें कि आप स्थानीय (fs- आधारित) svn रेपो को निकाल सकते हैं, चीजों को परखने के लिए।
troelskn

10
मैंने चरण 5 के स्थान पर "git rebase - Santiago trunk --root" का उपयोग करके इन समान चरणों का पालन किया है और बहुत अधिक सफलता मिली है। टन के बजाय केवल कुछ मुट्ठी भर मर्जों का समाधान होता है।
काबी जूल 21'11

5
मेरे मामले में इस क्रम ने काम नहीं किया। हमेशा एक संदेश "HEAD इतिहास से अपस्ट्रीम SVN सूचना निर्धारित करने में असमर्थ" दिखाया गया था। इसलिए, संभव नहीं है।
फेडिर RYKHTIK

2
कोई बात नहीं, मैंने एसवीएन मानक सेटअप (ट्रंक / शाखाएँ / टैग /) का पालन नहीं करने के रूप में स्मार्ट और ओ-एस प्राप्त करने की कोशिश की। इसके बिना काम करने के लिए इसे प्राप्त नहीं कर सका।
जेम्स मैकमोहन

33

यहां बताया गया है कि हमने इसे कैसे काम किया:

अपनी मशीन पर कहीं न कहीं अपने गिट रिपॉजिटरी को क्लोन करें।

.It को खोलें / कॉन्फ़िगर करें और निम्न जोड़ें ( केवल एक Git रिपॉजिटरी के केवल पढ़ने के लिए SVN दर्पण बनाए रखने से ):

[svn-remote "svn"]
    url = https://your.svn.repo
    fetch = :refs/remotes/git-svn

अब, कंसोल विंडो से, इन्हें टाइप करें:

git svn fetch svn
git checkout -b svn git-svn
git merge master

अब, अगर यह किसी भी कारण से यहाँ टूटता है, तो इन तीन पंक्तियों को टाइप करें:

git checkout --theirs .
git add .
git commit -m "some message"

और अंत में, आप एसवीएन के लिए प्रतिबद्ध हो सकते हैं:

git svn dcommit

नोट: मैं हमेशा उस फ़ोल्डर को बाद में स्क्रैप करता हूं।


6
+1 यह वास्तव में मेरे लिए काम करता है (जिसके पास ट्रंक / बेस नहीं है), अन्य जवाबों के विपरीत जो देने में लगे रहेUnable to determine upstream SVN information from HEAD history.
स्टिजर्न

2
एक और अच्छा सारांश: codeography.com/2010/03/17/howto-mirror-git-to-subversion.html
टॉमी

2
मैंने इस तकनीक की कोशिश की, लेकिन इसने इतिहास को आयात नहीं किया। Btw, "git मर्ज मास्टर" अब "git मर्ज - कुल-असंबद्ध-इतिहास मास्टर"
Berend de Boer

1
यदि आप पूरी तरह से एसवीएन में क्या लिखना चाहते हैं, क्या है, इसका उपयोग करें git merge -s recursive -Xtheirs --allow-unrelated-histories master
user1475814

28

git rebaseसीधे उपयोग करने से पहला कमिट खो जाएगा। Git इसे अलग मानता है और इसे फिर से नहीं बना सकता।

एक प्रक्रिया है जो पूर्ण इतिहास को संरक्षित करेगी: http://kerneltrap.org/mailarchive/git/2008/10/26/3815034

मैं यहाँ समाधान स्थानांतरित करूँगा, लेकिन क्रेडिट ब्योर्न के लिए हैं।

प्रारंभिक git-svn:

git svn init -s --prefix=svn/ https://svn/svn/SANDBOX/warren/test2

Theprefix आपको "svn / trunk" जैसी दूरस्थ ट्रैकिंग शाखाएं देता है जो कि अच्छा है क्योंकि यदि आप अपनी स्थानीय शाखा को "ट्रंक" कहते हैं तो आपको अस्पष्ट नाम नहीं मिलते हैं। और -sमानक ट्रंक / टैग / शाखाओं लेआउट के लिए एक शॉर्टकट है।

SVN से प्रारंभिक सामान प्राप्त करें:

git svn fetch

अब अपने रूट कमिट के हैश को देखें (एक कमिट दिखाना चाहिए):

git rev-list --parents master | grep '^.\{40\}$'

फिर खाली ट्रंक कमिट का हैश प्राप्त करें:

git rev-parse svn/trunk

ग्राफ्ट बनाएं:

echo <root-commit-hash> <svn-trunk-commit-hash> >> .git/info/grafts

अब, "गिटक" को svn/trunkपहली प्रतिबद्ध के रूप में दिखाना चाहिए, जिस पर आपकी मास्टर शाखा आधारित है।

ग्राफ्ट को स्थायी बनाएं:

git filter-branch -- ^svn/trunk --all

ग्राफ्ट गिराएं:

rm .git/info/grafts

gitk को अभी भी svn/trunkगुरु के वंश में दिखाना चाहिए ।

ट्रंक के शीर्ष पर अपने इतिहास को परिष्कृत करें:

git svn rebase

और अब "git svn dcommit -n" आपको यह बताना चाहिए कि यह ट्रंक के लिए प्रतिबद्ध है।

git svn dcommit

क्या आप बता सकते हैं कि यह तकनीक ऊपर से अधिक स्पष्ट रूप से कैसे भिन्न है।
cmcginty

3
जब मैं "git Rev-parse svn / trunk" आज़माता हूं तो यह अज्ञात संशोधन या पथ की रिपोर्ट करता है जो कार्यशील पेड़ में नहीं है।
एडम नेस

यह एकमात्र उत्तर है जो मेरे लिए काम करता है, सिवाय कदम git फ़िल्टर-शाखा और ड्रॉप ग्राफ्ट की जरूरत नहीं थी: मैंने ग्राफ्ट बनाने के बाद एक रिबेस किया, और फिर git svn dcommit किया।
fc7

8

अपनी परियोजना के लिए तोड़फोड़ भंडार में एक नई निर्देशिका बनाएँ।

# svn mkdir --parents svn://ip/path/project/trunk

अपने Git- प्रबंधित प्रोजेक्ट में बदलें और git-svn को इनिशियलाइज़ करें।

# git svn init svn://ip/path/project -s
# git svn fetch

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


मैंने इस उत्तर का उपयोग hassox.blogspot.com/2007/12/use-git-with-svn.html पर निर्देशों के साथ किया था मैंने इन आदेशों का पालन किया, फिर ट्रंक नाम देखने के लिए "#git शाखा-ए"। तब: # git चेकआउट-बी लोकल-svn ट्रंक # git मर्ज मास्टर # git svn dmitmit .itignore .svn निर्देशिका को याद रखें!
cflewis

जैसा कि मैंने अभी भी वही ऑपरेशन किया है, मैं यह स्पष्ट करना चाहता था कि कुछ समय के लिए (जनवरी '09), git रूट कमिट पर रीबेस ऑपरेशन कर सकता है। यह बहुत सारे पुराने लेखों की तुलना में प्रक्रिया को बहुत सरल बनाता है, जो इसके संकेत पर टिप्पणी करते हैं। देखें इसके .arubything.com
2009/

"-S" git svn init विकल्प क्या करता है? मैं इसे git svn के लिए मैन पेजों में नहीं देख सकता।
नाथन

मैन पेज को फिर से पढ़ें, शायद "-s" के लिए खोज करें क्योंकि यह वहां है। यह "--stdlayout" के लिए एक उपनाम है।
बॉम्बे

7

Git -> संपूर्ण प्रतिबद्ध इतिहास के साथ SVN

मेरे पास एक Git प्रोजेक्ट था और इसे SVN में स्थानांतरित करना था। इस तरह से मैंने इसे बनाया, पूरे प्रतिबद्ध इतिहास को ध्यान में रखते हुए। केवल एक चीज जो खो जाती है वह मूल प्रतिबद्ध समय है क्योंकि libSVN स्थानीय समय निर्धारित करेगा जब हम करते हैं git svn dcommit

कैसे:

  1. एक SVN रिपॉजिटरी है जहाँ हम अपना सामान आयात करना चाहते हैं और इसे git-svn के साथ क्लोन करना चाहते हैं:

    git svn clone https://path.to/svn/repository repo.git-svn`
    
  2. वहा जाओ:

    cd repo.git-svn
    
  3. Git रिपॉजिटरी का रिमोट जोड़ें (इस उदाहरण में मैं C: /Projects/repo.git का उपयोग कर रहा हूं )। आप SVN को आगे बढ़ाना चाहते हैं और इसे पुराना नाम देना चाहते हैं:

    git remote add old-git file:///C/Projects/repo.git/
    
  4. पुरानी शाखा के भंडार से वर्तमान शाखा में मास्टर शाखा से जानकारी प्राप्त करें:

    git fetch old-git master
    
  5. पुराने भंडार के मास्टर शाखा को एक नई शाखा में चेकआउट करें जिसे वर्तमान भंडार में पुराना कहा जाता है:

    git checkout -b old old-git/master`
    
  6. पुराने-गिट / मास्टर के शीर्ष पर हेड लगाने के लिए रिबेस। यह आपके सभी आवागमन को बनाए रखेगा। यह मूल रूप से Git में किए गए आपके सभी कार्यों को लेने और उस कार्य के शीर्ष पर रखने के लिए है जिसे आप SVN से प्राप्त कर रहे हैं।

    git rebase master
    
  7. अब अपनी मास्टर शाखा में वापस जाएं:

    git checkout master
    

    और आप देख सकते हैं कि आपके पास एक स्वच्छ प्रतिबद्ध इतिहास है। यह वही है जो आप एसवीएन को धक्का देना चाहते हैं।

  8. अपने काम को SVN में धकेलें:

    git svn dcommit
    

बस इतना ही। यह बहुत साफ है, कोई हैकिंग नहीं है, और सब कुछ पूरी तरह से बॉक्स से बाहर काम करता है। का आनंद लें।


इसी तरह की प्रक्रिया chani.wordpress.com/2012/01/25/…
TWiStErRob

जैसा दिखता है। हालाँकि, मुझे उसका रास्ता बहुत भ्रामक लगता है और मेरा बहुत छोटा है (19/23 की तुलना में 8 कदम)। शायद मैं उसे सही ढंग से नहीं पा रहा हूं लेकिन मुझे लगता है कि वह अपनी दूसरी गोली में svn और git कमांड मिलाता है।
कोडिंगडेव

आह, हाँ, अंतर यह है कि आपकी प्रक्रिया एसवीएन रेपो की जड़ को आयात करती है, उसका आयात एक सबफ़ोल्डर में करता है, इसलिए कुछ git svnप्रॉप्स की आवश्यकता होती है।
ट्वीस्टरेब डेब

चरण 7 में, क्या कोई पुराना मर्ज पुराना नहीं होना चाहिए? मेरे लिए ऐसा लगता है कि आप गुरु का एक ऐसा शिखर बना रहे हैं जिसे आपने नहीं बदला है ?!
अलेक्जेंडर

@ एसेक्सैंडर ने 'git rebase master' का उपयोग करते हुए हम एक फास्ट-फॉरवर्ड मर्ज प्राप्त करते हैं, जो कि दो माता-पिता वाले मर्ज किए बिना एक रैखिक मर्ज है। हम यहाँ एक रैखिक इतिहास रखना चाहते हैं।
कोडिंगडेव


3

मुझे अपने मौजूदा गिट रिपॉजिटरी को एक खाली एसवीएन रिपॉजिटरी में करने की आवश्यकता थी।

इस तरह से मैं यह करने में कामयाब रहा:

$ git checkout master
$ git branch svn
$ git svn init -s --prefix=svn/ --username <user> https://path.to.repo.com/svn/project/
$ git checkout svn
$ git svn fetch
$ git reset --hard remotes/svn/trunk
$ git merge master
$ git svn dcommit

यह समस्याओं के बिना काम किया। मुझे उम्मीद है इससे किसी को सहायता मिलेगी।

चूंकि मुझे स्वयं को SVN रिपॉजिटरी (मेरे originनिजी / सार्वजनिक कुंजी प्रमाणीकरण का उपयोग करता है) के लिए एक अलग उपयोगकर्ता नाम के साथ अधिकृत करना पड़ा, मुझे --usernameसंपत्ति का उपयोग करना पड़ा ।


आपको git-svnयह संभव होने से पहले स्थापित करने की आवश्यकता हो सकती है, देखें stackoverflow.com/questions/527037/git-svn-not-a-git-command
flexponive

2

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

मैंने Git-to-SVN रूपांतरण का प्रयास नहीं किया है, लेकिन SVN -> SVN उदाहरण के लिए यह उत्तर देखें ।


2

फिर भी एक और क्रम जिसने काम किया (प्रत्येक चरण पर कुछ टिप्पणियों के साथ):

  1. स्थापित करें git-svnऔर subversionटूलकिट:

    sudo apt-get install git-svn subversion
    
  2. अंदर स्विच करें PROJECT_FOLDER

    cd PROJECT_FOLDER
    
  3. सबवर्सन सर्वर पर प्रोजेक्ट पथ बनाएं (दुर्भाग्य से वर्तमान git-svnप्लगइन में कछुआ एसवीएन की तुलना में दोष है)। यह स्रोत कोड को सीधे स्टोर करने में असमर्थ है PROJECT_FOLDER। इसके बजाय, डिफ़ॉल्ट रूप से, यह सभी कोड को अपलोड करेगा PROJECT_FOLDER/trunk

    svn mkdir - अपरेंटस प्रोटोकॉल: /// पाथ / टू / रेपो / PROJECT_FOLDER / ट्रंक -m "git रेपो प्लेसहोल्डर बनाना"

यह वह स्थान है जहां trunkपथ के अंत में अनिवार्य है

  1. फ़ोल्डर के git-svnअंदर प्लगइन संदर्भ को इनिशियलाइज़ करें.git

    git svn init -s protocol:///path/to/repo/PROJECT_FOLDER
    

    यह वह स्थान है जहाँ trunkपथ के अंत में अनावश्यक है

  2. खाली Subversionरिपॉजिटरी जानकारी प्राप्त करें

    git svn fetch
    

    यह कदम git-svnप्लगइन के साथ तोड़फोड़ सर्वर को सिंक्रनाइज़ करने में मदद कर रहा है । यह वह क्षण होता है जब git-svnप्लगइन remotes/originपथ स्थापित करता है और इसे trunkसर्वर साइड पर सबफ़ोल्डर के साथ जोड़ता है।

  3. Rebase पुराना Git कमिट git-svnइस प्रक्रिया में शामिल होने से पहले हुआ (यह कदम वैकल्पिक है )

    git rebase origin/trunk
    
  4. करने के लिए नई / संशोधित फ़ाइलें जोड़ें (यह कदम Git गतिविधियों के लिए नियमित है और वैकल्पिक है )

    git add .
    
  5. स्थानीय गिट रिपॉजिटरी में नए सिरे से जोड़ी गई फ़ाइलों को कमिट करें (यह चरण वैकल्पिक है और केवल तभी लागू होता है जब चरण 7 का उपयोग किया गया हो):

    git commit -m "Importing Git repository"
    
  6. सभी प्रोजेक्ट को इतिहास में तोड़फोड़ सर्वर में बदल रहा है:

    git svn dcommit
    

1

आप एक नया SVN रिपॉजिटरी बना सकते हैं। अपने Git प्रोजेक्ट को निर्यात करें (.गित फ़ाइलों को हटा दें)। इसे SVN रिपॉजिटरी में जोड़ें (Git में अब तक आपके पास जो रिपॉजिटरी है, उसके साथ आरंभ करें)। फिर एक ताजा गिट परियोजना में एसवीएन रिपॉजिटरी आयात करने के निर्देशों का उपयोग करें।

लेकिन यह आपके पिछले गिट इतिहास को खो देगा।


1

यदि आपको किसी विशिष्ट SVN का उपयोग करने की आवश्यकता नहीं है और आप GitHub का उपयोग कर रहे हैं तो आप उनके SVN कनेक्टर का उपयोग कर सकते हैं।

अधिक जानकारी यहाँ है: तोड़फोड़ के साथ GitHub पर सहयोग


एसवीएन क्या? में ( "... कोई भी विशिष्ट एसवीएन और ..." )। SVN संस्करण? SVN क्लाइंट? या कुछ और?
पीटर मोर्टेंसन

1

मैं वर्डप्रेस समुदाय में उपयोग किए जा रहे एक महान टूल को स्कैटर के रूप में साझा करना चाहूंगा

Git वर्डप्रेस प्लगइन्स और थोड़ा सा बिखराव

यह उपयोगकर्ताओं को अपने git रिपॉजिटरी को wordpress.org SVN पर स्वचालित रूप से भेजने में सक्षम बनाता है। सिद्धांत रूप में, यह कोड किसी भी एसवीएन रिपॉजिटरी पर लागू किया जा सकता है।


लिंक प्रभावी रूप से टूटने लगता है ( "evansolomon.me पर सर्वर प्रतिक्रिया के लिए बहुत लंबा समय ले रहा है।" )।
पीटर मोर्टेंसन

1

मुझे हाल ही में SVN के लिए कई Git रिपॉजिटरी में माइग्रेट करना पड़ा, और सभी समाधानों को आज़माने के बाद, जो मुझे मिल सका, उसने आखिर मेरे लिए क्या काम किया, Mercurial था (हाँ, एक तीसरे VCS का उपयोग करके )। इस गाइड का उपयोग करते हुए , मैं निम्नलिखित प्रक्रिया के साथ आया (लिनक्स पर, लेकिन मूल विचार विंडोज पर भी काम करना चाहिए)।

  1. आवश्यक पैकेज:

    $ sudo apt-get install git subversion mercurial python-subversion
    
  2. निम्नलिखित को जोड़कर मर्क्यूरियल को कॉन्फ़िगर करने की आवश्यकता है ~/.hgrc:

    [extensions]
    hgext.convert=
    
  3. कुछ अस्थायी कार्य निर्देशिकाएं बनाएं (मेरे पास प्रवास के लिए कई रिपॉजिटरी थीं इसलिए मैंने SVN और Git संस्करणों के लिए निर्देशिका बनाई, उन्हें अलग रखने के लिए):

    $ mkdir svn
    $ mkdir git
    
  4. एक खाली स्थानीय SVN भंडार बनाएं:

    $ svnadmin create svn/project
    
  5. मौजूदा गिट रिपॉजिटरी को क्लोन करें:

    $ git clone server/path/project.git git/project
    
  6. मर्क्यूरियल को अपनी बात करने दें:

    $ hg convert --dest-type svn git/project svn/project
    
  7. अब एसवीएन रिपॉजिटरी में पूर्ण प्रतिबद्ध इतिहास होना चाहिए, लेकिन मूल टाइमस्टैम्प के साथ नहीं। यदि यह कोई समस्या नहीं है, तो अगले भाग को चरण 11 पर छोड़ें।

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

    #!/bin/bash
    exit 0;
    

    इस स्क्रिप्ट को निष्पादन योग्य बनाया जाना है:

    $ chmod +x svn/project/hooks/pre-revprop-change
    
  9. Mercurial ने SVN रिपॉजिटरी की एक वर्किंग कॉपी बनाई, जिसका नाम प्रोजेक्ट -wc है, इसलिए इसे स्विच करें और प्रतिबद्ध समय को संपादित करें:

    $ cd project-wc
    $ svn propedit svn:date --revprop -r 1
    

    सही तिथि और समय दर्ज करें (टाइमज़ोन पर ध्यान दें!) और सहेजें। आपको यह कहते हुए एक संदेश प्राप्त करना चाहिए कि "संपत्ति के लिए नया मूल्य निर्धारित करें svn: तारीख 1 पर संशोधन"।
    अब कुल्ला और हर दूसरे संशोधन के लिए दोहराएं।

  10. वैकल्पिक रूप से यह सुनिश्चित करने के लिए प्रतिबद्ध इतिहास की जाँच करें कि सब कुछ ठीक लग रहा है:

    $ svn log -r 1:HEAD
    

    फिर एक स्तर पर वापस जाएं:

    $ cd ..
    
  11. भंडार को डंप करें:

    $ svnadmin dump svn/project > project.dump
    
  12. और अपने तोड़फोड़ सर्वर पर डंप लोड। किया हुआ!

यह प्रक्रिया संभवतः दूरस्थ रिपॉजिटरी के बीच सीधे काम करेगी, लेकिन मुझे स्थानीय लोगों के साथ काम करना आसान लगा। प्रतिबद्ध समय को ठीक करना बहुत काम था, लेकिन कुल मिलाकर यह प्रक्रिया मुझे मिली किसी भी अन्य विधि की तुलना में बहुत अधिक सीधी थी।


1

तीन विधियाँ हैं :

  1. अन्य उत्तरों के रूप में रिबास

  2. प्रतिबद्ध आईडी: एसवीएन पहले कमिट आईडी और जीआईटी पहले कमिट आईडी खोजें, उनकी ईजी / जानकारी / ग्राफ्ट: echo "git_id svn_id}" > .git/info/graftsफिर प्रतिध्वनि करेंgit svn dcommit

  3. चेकआउट हर git कमिट, svn_repo, svn कमिट में फाइल कॉपी करें

बैश डेमो ub जीथब डेमो

v1.x x रिबास और कमिट आईडी का उपयोग करें

v2.x: प्रतिलिपि फ़ाइलों का उपयोग करें, फिर svn कमिट करें


0

मेरे मामले में, मुझे SVN से एक साफ परियोजना शुरू करनी थी

$ Project> git svn init protocol://path/to/repo -s
$ Project> git svn fetch

अपने सभी प्रोजेक्ट स्रोतों को जोड़ें ...

$ Project> git add .
$ Project> git commit -m "Importing project sources"
$ Project> git svn dcommit

0

मैं बस अपने कुछ अनुभव स्वीकार किए गए उत्तर के साथ साझा करना चाहता हूं। अंतिम चरण चलाने से पहले मैंने सभी चरण किए और सब ठीक था:

git svn dcommit

$ git svn dcommit

/Usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm लाइन 101 पर प्रतिस्थापन (ओं ///) में एकतरफा मूल्य $ यू का उपयोग।

संघनन (।) या स्ट्रिंग में /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm लाइन 101 पर uninitialized मूल्य $ u का उपयोग। रिफल्स / मूल / HEAD: ' https://192.168.2.101/ svn / PROJECT_NAME '' में नहीं मिला

मुझे थ्रेड https://github.com/nirvdrum/svn2git/issues/50 मिला और अंत में मैंने जो हल दिया, उसे मैंने 101/ usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm लाइन में निम्नलिखित फ़ाइल में लागू किया।

मैंने प्रतिस्थापित किया

$u =~ s!^\Q$url\E(/|$)!! or die

साथ में

if (!$u) {
    $u = $pathname;
} 
else {
       $u =~ s!^\Q$url\E(/|$)!! or die
      "$refname: '$url' not found in '$u'\n";
}

इससे मेरा मुद्दा ठीक हो गया।


-1

क्या होगा यदि आप एसवीएन रिपॉजिटरी में जीआईटी में किए गए हर कमिट को नहीं करना चाहते हैं ? क्या होगा यदि आप केवल चुनिंदा रूप से पाइप भेजना चाहते हैं? खैर, मेरे पास एक बेहतर उपाय है।

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

फिर मैं एक अलग एसवीएन स्थानीय कामकाजी प्रतिलिपि रखता हूं जो एक अलग फ़ोल्डर में है। यह वही है जो मैं एसवीएन से वापस करता हूं, और मैं बस इसके लिए एसवीएन कमांड लाइन उपयोगिता का उपयोग करता हूं।

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

इस तरह मुझे कभी कोई रिबासिंग नहीं करनी है, क्योंकि रिबासिंग फ्रीबेसिंग की तरह है।

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