svn - एसवीएन को मौजूदा गिट भंडार को धक्का देना




git git-svn (11)

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

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

अपने गिट-प्रबंधित प्रोजेक्ट में बदलें और गिट-एसवीएन शुरू करें।

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

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

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

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

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

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

ऐसा करने के तरीके पर कोई निर्देश बहुत सराहना की जाएगी!


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

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


गिट रिबेस का उपयोग करने से पहले पहली प्रतिबद्धता खो जाएगी। गिट इसे अलग करता है और इसे पुन: उत्पन्न नहीं कर सकता है।

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

मैं यहां समाधान का लेनदेन करूंगा, लेकिन क्रेडिट Björn के लिए हैं।

गिट-एसवीएन शुरू करें:

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

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

एसवीएन से शुरुआती सामान प्राप्त करें:

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

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

भ्रष्टाचार को स्थायी बनाएं:

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

भ्रष्टाचार छोड़ो:

rm .git/info/grafts

gitk अभी भी मास्टर के पूर्वजों में svn / ट्रंक दिखाना चाहिए

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

git svn rebase

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

git svn dcommit

बस स्वीकार्य उत्तर के साथ मेरा कुछ अनुभव साझा करना चाहते हैं। मैंने आखिरी कदम चलाने से पहले सभी कदम उठाए और सब ठीक थे

git svn dcommit

$ git svn dcommit

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

Concatenation (।) में स्ट्रिंग अनन्य मूल्य $ यू का उपयोग करें या /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm लाइन 101 पर स्ट्रिंग का उपयोग करें। Refs / remotes / origin / 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";
}

यह मेरी समस्या तय है


मुझे इसकी भी आवश्यकता थी, और बॉम्बे के जवाब की मदद से + कुछ घूमते हुए, मुझे यह काम मिल गया। यहां नुस्खा है:

आयात गिट -> svn

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 के बाद आपको इस तरह का एक गुप्त संदेश मिलेगा:

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

बस इसे अनदेखा करें।

जब आप # 5 चलाते हैं, तो आपको संघर्ष मिल सकता है । राज्य "unmerged" के साथ फ़ाइलों को जोड़कर और पुन: शुरू करने के साथ इन्हें हल करें। आखिरकार, आप कर लेंगे; फिर dcommit का उपयोग करके, svn-repo पर वापस सिंक करें। बस इतना ही।

सिंक में repos रखना

अब आप निम्न आदेशों का उपयोग करके svn -> git से सिंक कर सकते हैं:

git svn fetch
git rebase trunk

और गिट से सिंक करने के लिए -> 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 चलाते हैं, और आप अपने काम का बैकअप लेने के लिए पर्याप्त स्मार्ट नहीं थे (पूछें नहीं ...), तो आप एक ही कमांड को फिर से नहीं चला सकते हैं। हालांकि आप जारी करके परिवर्तन पूर्ववत कर सकते हैं:

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

और अनुभाग [svn-remote "svn"] अनुभाग को हटा दें।

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


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

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

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

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

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

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

    $ git clone server/path/project.git git/project
    
  6. Mercurial इसकी बात करते हैं:

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

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

    #!/bin/bash
    exit 0;
    

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

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

    $ 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. और अपने सबवर्जन सर्वर पर डंप लोड करें। किया हुआ!

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


मैं SubGit का उपयोग कर 4 आदेशों में एक बहुत ही छोटा निर्देश प्रस्तावित करता हूं । विवरण के लिए यह post देखें।


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

http://evansolomon.me/notes/git-wordpress-plugins-and-a-bit-of-sanity-scatter/

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


यदि आपको किसी भी विशिष्ट svn का उपयोग करने की आवश्यकता नहीं है और आप गीथब का उपयोग कर रहे हैं तो आप अपने एसवीएन कनेक्टर का उपयोग कर सकते हैं।

यहां अधिक जानकारी https://github.com/blog/1178-collaborating-on-github-with-subversion


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

अपनी मशीन पर कहीं भी अपने गिट repo क्लोन करें। ओपन .git / config और निम्न जोड़ें ( http://www.kerrybuckley.org/2009/10/06/maintaining-a-read-only-svn-mirror-of-a-git-repository/ ) से:

[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

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

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

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

git svn dcommit

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

चीयर्स!


गिट -> पूर्ण प्रतिबद्धता इतिहास के साथ एसवीएन

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

कैसे:

1) एक svn भंडार है जहां हम अपनी सामग्री आयात करना चाहते हैं और इसे git-svn के साथ क्लोन करना चाहते हैं:

git svn clone https://path.to/svn/repository repo.git-svn

2) वहां जाएं:

cd repo.git-svn

3) गिट रिपॉजिटरी के रिमोट को जोड़ें (इस उदाहरण में मैं सी: /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) सिर को पुराने-गिट / मास्टर के शीर्ष पर रखने के लिए रीबेस करें। यह आपके सभी कामों को बनाए रखेगा। मूल रूप से यह आपके काम को गिट में करने के लिए क्या करना है और इसे उस काम के शीर्ष पर रखना है जिसे आप svn से एक्सेस कर रहे हैं।

git rebase master

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

git checkout master

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

8) अपने काम को svn पर पुश करें:

git svn dcommit

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





git-svn