रेपो लाने के बाद मैं एक दूरस्थ शाखा के बारे में git-svn कैसे बताऊं?


193

मैं git-svnअपनी कंपनी के केंद्रीय तोड़फोड़ भंडार के खिलाफ काम करने के लिए उपयोग कर रहा हूं । हमने हाल ही में केंद्रीय रेपो में एक नई सुविधा शाखा बनाई है।

मैं इसके बारे में Git को कैसे बताऊं? जब मैं दौड़ता git branch -rहूं तो मैं केवल उन शाखाओं को देख सकता हूं, जब मैं fetchअपने गिट रेपो को आरम्भ करने के लिए तोड़फोड़ रेपो के खिलाफ दौड़ता था ?


यहाँ से उत्तर: stackoverflow.com/questions/13376917/… भी उपयोगी हो सकता है।
टॉमस गैंडर

जवाबों:


294

आप दूरस्थ शाखा को मैन्युअल रूप से जोड़ सकते हैं,

git config --add svn-remote.newbranch.url https://svn/path_to_newbranch/
git config --add svn-remote.newbranch.fetch :refs/remotes/newbranch
git svn fetch newbranch [-r<rev>]
git checkout -b local-newbranch -t newbranch
git svn rebase newbranch

3
डॉक्स के लिए इस लिंक को एक संदर्भ kernel.org/pub/software/scm/git/docs/git-svn.html के
slf

1
.It / config से यह समझना काफी आसान है कि दूरस्थ शाखाओं को एकल / एकाधिक रिपॉजिटरी से कैसे कॉन्फ़िगर किया जा सकता है।
मिकेल लेपिस्टो

6
अगर मैं इसे आठ बार बढ़ा सकता हूं, तो मैं करूंगा। अंत में, एक svn शाखा जोड़ने का एक तरीका जो एक गैर-मानक स्थान में जोड़ा गया है!
टिम किटिंग

7
मुझे fatal: Cannot setup tracking information; starting point 'newbranch' is not a branch.git चेकआउट स्टेप मिलता है।
phpguru

17
mj1531

96

यदि आप सभी दूरस्थ svn शाखाओं को ट्रैक करना चाहते हैं, तो समाधान उतना ही सरल है:

git svn fetch

यह उन सभी दूरस्थ शाखाओं को प्राप्त कर लेगा जो अभी तक प्राप्त नहीं हुई हैं।

अतिरिक्त टिप: यदि आपने पहले केवल ट्रंक की जाँच की है, और बाद में आप सभी शाखाओं को ट्रैक करना चाहते हैं, तो .git/configइस तरह दिखने के लिए संपादित करें और फिर से चलाएँ git svn fetch:

[svn-remote "svn"]
        url = https://svn/path_to_repo_root/
        fetch = path_to_trunk:refs/remotes/git-svn
        branches = path_to_branches/*:refs/remotes/*

मुख्य बिंदुओं को urlरिपॉजिटरी रूट की ओर इशारा किया जाना चाहिए, और जिन रास्तों को परिभाषित किया जाना चाहिए fetchऔर branchesजिनके सापेक्ष होना चाहिए url

यदि आप सभी के बजाय केवल विशिष्ट शाखाएँ प्राप्त करना चाहते हैं, तो इसमें एक अच्छा उदाहरण है git svn --help:

[svn-remote "huge-project"]
        url = http://server.org/svn
        fetch = trunk/src:refs/remotes/trunk
        branches = branches/{red,green}/src:refs/remotes/branches/*
        tags = tags/{1.0,2.0}/src:refs/remotes/tags/*

पुराने संस्करणों के साथ git-svn, एक बार जब आप इस तरह की शाखाएँ निर्दिष्ट करते हैं, तो आप नई शाखाएँ प्राप्त नहीं कर सकते हैं git svn fetch। एक वर्कअराउंड fetchइस तरह अधिक लाइनें जोड़ रहा है :

[svn-remote "huge-project"]
        url = http://server.org/svn
        fetch = trunk/src:refs/remotes/trunk
        fetch = branches/blue:refs/remotes/branches/blue
        fetch = branches/yellow:refs/remotes/branches/yellow
        branches = branches/{red,green}/src:refs/remotes/branches/*

@AndyEstes द्वारा एक और समाधान: संपादित करें .git/svn/.metadata किसी भी नई-निर्दिष्ट शाखाओं या टैग के से पहले branches-maxRevया उसके tags-maxRevसंशोधन को या बदलें । एक बार जब आप ऐसा कर लेते हैं, git svn fetchतो नई svn दूरस्थ शाखा को ट्रैक करने के लिए दौड़ें ।


1
यदि आपने पहले से ही उन सेटिंग्स को सेट करने से पहले रिविजन किया है, जिसमें svn ब्रांचिंग की गई है, तो आप git svn रीसेट करना चाह सकते हैं।
kcm1700

3
संपादन .git/svn/.metadataबहुत मददगार था! मैं अपने में अतिरिक्त शाखाएँ जोड़ रहा था .git/config, जो git svn fetchनहीं उठाया - क्योंकि मेटाडेटा संशोधन संख्या "बहुत आगे" थी। एक मामले में, एक शाखा से केवल अंतिम प्रतिबद्धता प्राप्त की गई थी। मैं मैन्युअल रूप से (जिसका नाम बदलकर दोषपूर्ण शाखा से छुटकारा मिल गया है .git/svn/refs/remotes/svn/qa/XYZकरने के लिए .git/svn/refs/remotes/svn/qa/XYZ~, में अपने अस्तित्व को गिरा दिया .git/packed-refs, आदि) ... मेटाडाटा के लिए उठाया एक "पहले" संशोधन संख्या ... दौड़ा git svn fetchअंत में एक पूरा इतिहास w / सही, जुड़ा ग्राफ मिलता है।
स्टारलॉक

8
यह स्वीकार किया जा सकता है! @ भजन, आपने मुझे घंटों सिरदर्द से बचाया! यदि आप कभी भारत आते हैं, तो मैं आपको बियर के लिए बाहर ले जाऊंगा!
रूपेश शेनॉय

1
या: git svn fetch --all
केनोरब

1
यह उत्तर आश्चर्यजनक है, क्योंकि यह 7 सवालों के बारे में जवाब देता है, जिनके बारे में मुझे कोई जवाब नहीं मिला, और यह 6 पेज की कहानी लिखे बिना ऐसा करता है।
Droj

53

ऐसा प्रतीत होता है कि मुझे बस जरूरत है git svn fetch; किसी तरह मैंने अपने आप को आश्वस्त किया था कि केवल परिवर्तनों के बजाय पूरे रेपो को लाया जाएगा।


7
@mitjak यह सही उत्तर क्यों नहीं है, अगर इसका समाधान है? मैं प्रतिक्रिया की सूक्ष्मता को नहीं समझता।
९'११

'a solution' शायद 'the solution' नहीं है
slf

1
@ श्रोलम्स: मुझे पूरा यकीन है कि मितजक का मतलब है कि यह आपकी समस्या का समाधान है, लेकिन आपके द्वारा पूछे गए सवाल का जवाब नहीं। (क्योंकि आपने गलत सवाल पूछा था; जैसा कि आपने उस समय इस मुद्दे की गलत व्याख्या की थी।)
माइक नेल्सन

यह उस समय काम करता है जब शाखा उस समय मौजूद होती है जब आपने svn रिपॉजिटरी को git में क्लोन किया था। यह काम नहीं करेगा अगर svn रिपॉजिटरी में शाखा बाद में बनाई गई थी।
पेट्र ग्लैडिख

3
यह ठीक काम करता है जब शाखा क्लोन के बाद बनाई गई थी, मैं इसे हर समय करता हूं।
टिम गौटियर

15

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

इसका समाधान यह था:

  1. शाखा बनाने से पहले ट्रंक पर हुई अंतिम प्रतिबद्ध का SHA1 खोजें।
  2. नई शाखा पर पहली प्रतिबद्धताओं का SHA1 खोजें (संदेश संभवतः "नई शाखा बनाया गया है, ट्रंक @ 12345 से कॉपी किया गया" या कुछ और)
  3. git diff-tree <sha1 from step 1> <sha1 from step 2>- कोई आउटपुट नहीं होना चाहिए। यदि आउटपुट है, तो आपने गलत कमिट्स का चयन किया होगा।
  4. git checkout local-newbranchतब git rebase <sha1 from step 1>। यह local-newbranchनए पेड़ पर छूट remotes/newbranchदेगा लेकिन फिर भी काट दिया जाएगा।
  5. फ़ाइल पर जाएं .git/refs/remotes/newbranchऔर इसे संपादित करने के लिए नई कमेटी के पूर्ण SHA1 (छूट पर newbranch) को सम्‍मिलित करें जो कि वर्तमान में बताए गए पुराने कमिट से मेल खाती है। (या शायद का उपयोग करें git-update-ref refs/remotes/newbranch <new-SHA>। आपको धन्यवाद।)
  6. अगली बार जब आप git svn dcommitकरने के लिए newbranch, आप कुछ लॉग को अद्यतन करने के इसके बारे में संदेशों की एक गुच्छा मिल जाएगा। मुझे लगता है कि यह सामान्य है।

मैं gitk --allपूरे समय खुला रखने और इसे ताज़ा करने की सलाह देता हूं कि आप क्या कर रहे हैं। मैं अभी भी git और git svn के लिए नया हूँ, इसलिए कृपया इस पद्धति में सुधार का सुझाव दें।


2
धन्यवाद, यह उपयोगी लगता है। लगभग 5. शायद 'git-update-ref refs / remotes / newbranch <new-SHA>' अधिक सुरक्षित विकल्प है।
२३

बस फिर से वजंगस की कोशिश की और इसने पूरी तरह से काम किया। मैं इसे वैसे भी छोड़ दूँगा क्योंकि यह किसी के लिए मूल्यवान हो सकता है ...
21

1
vjangus समाधान हमेशा ट्रंक से डिस्कनेक्ट नई शाखा बनाता है। मुझे लगता है कि इस वजह से एसवीएन का खुद पर कोई सुराग नहीं है कि वास्तविक सामग्री को कैसे कॉपी किया जाता है।
bogdan.mustiata

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

7

वजंगस के उत्तर का सरलीकरण:

यदि आप SVN में मानक लेआउट का उपयोग कर रहे हैं और सामान्य svn init किया है, तो git-svn आपके लिए कॉन्फिग स्टफ करेगा। बस:

  1. एसवीएन में शाखा-कॉपी संशोधन का पता लगाएं
  2. उस संशोधन को git-svn के साथ लाएं
  3. नए स्थानीय शाखा ट्रैकिंग रिमोट बनाएं

एक उदाहरण। SVN यूआरएल है svn+ssh://gil@svn.myplace.com/repo। SVN शाखा मैं देख रहा हूँ newbranch। लोकल गिट ब्रांच (ट्रैकिंग रिमोट newbranch) होगी git-newbranch

चरण 1: शाखा-कॉपी संशोधन खोजें

    # svn लॉग - स्टॉप-ऑन-कॉपी svn + ssh: //gil@svn.myplace.com/repo/branches/newbranch | पूंछ -4
    r7802 | कोई | 2014-03-21 18:54:58 +0000 (शुक्र, 21 मार्च 2014) | 1 पंक्ति

    newbranch के लिए HEAD की शाखा
    -------------------------------------------------- ----------------------

एसवीएन में शाखा बिंदु 7802 है।

चरण 2: संशोधन लाएं

    # गिट svn -r 7802
    मिली संभावित शाखा बिंदु: svn + ssh: //gil@svn.myplace.com/repo/trunk => svn + ssh: //gil@svn.myplace.com/repo/branches/newbranch, 7801_
    मिली शाखा माता-पिता: (refs / remotes / trunk) 8dcf3c5793ff1a8a79dc94d268c91c2bf388894a
    Do_switch के साथ माता-पिता का अनुसरण करना
    सफलतापूर्वक माता-पिता का पालन किया
    r7802 = 9bbd4194041675ca5c9c6f3917e05ca5654a8a1e (refs / remotes / newbranch)

git-svn ने सभी काम किए और अब रिमोट के बारे में जानते हैं:

    # गिट शो-रेफ | grep newbranch
    2df23af4733f36f5ad3c14cc1fa582ceeb3edb5c refs / remb / newbranch

चरण 3: रिमोट को ट्रैक करने वाली अपनी नई स्थानीय शाखा बनाएँ:

    # git checkout -b git-newbranch -t newbranch
    फ़ाइलों की जाँच: 100% (413/413), किया।
    ब्रांच git-newbranch स्थानीय रेफरी refs / remotes / newbranch को ट्रैक करने के लिए सेट है।
    एक नई शाखा 'गिट-न्यूब्रांच' पर स्विच किया गया

इसके बाद अंत में मुझे समझने की अनुमति दी गई ( show-refअमूल्य है)! गलत शाखाओं को संदर्भित करने के साथ अटक गए किसी भी व्यक्ति के लिए, आप उन्हें हटा सकते हैं (मुझे करना था git branch -d newbranchऔर फिर रेफरी डायर को हटाने के लिए मजबूर करना होगा .git/svn/refs/remotes/newbranch) और फिर चरण 2 (ऊपर) पर शुरू करें।
टूटुज्जु १

5

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

मान लें कि आपका एसवीएन पेड़ वास्तव में गंदा है, बिना किसी तर्क के बहुत सारी शाखाएं हैं कि वे कैसे स्थित हैं, जैसे शाखाओं और उप-निर्देशिकाओं में अधिक शाखाएं हैं।

अर्थात

trunk
branches
  -> branch1
  -> sub-dir1
    -> branch2
    -> branch3
  -> sub-dir2
    -> branch4
    -> sub-dir3
      -> branchX 
<... hundreds more ...>

और आप बस अपनी गिट रिपॉजिटरी में शामिल होने के लिए कुछ शाखाओं को चुनना चाहते हैं।

आप पहले बिना किसी अतिरिक्त शाखाओं के केवल ट्रंक के साथ अपने भंडार में प्रवेश कर सकते हैं:

git svn clone -r 10000:HEAD https://svn.com/MyRepo myrepo --prefix=svn/ --trunk=trunk 

उसके बाद आपको निम्नलिखित कॉन्फ़िगरेशन देखना चाहिए:

localhost: elhigu$ git config --get-regexp "svn-remote."
svn-remote.svn.url https://svn.com/MyRepo
svn-remote.svn.fetch trunk:refs/remotes/svn/trunk

जब भी आप MyRepo से नई शाखा लाना चाहते हैं, तो आप विन्यास द्वारा नई भ्रूण प्रविष्टियाँ जोड़ सकते हैं:

git config --add svn-remote.svn.fetch branches/sub-dir2/branch4:refs/remotes/svn/branches/sub-dir2/branch4

या आप एक ही कॉन्फ़िगरेशन को .it / config में संपादित कर सकते हैं

बस चलाने के लिए उन्हें जोड़ने के बाद नई शाखाओं लाने के लिए:

git svn fetch -r 10000:HEAD

[संपादित करें] कभी-कभी नई जोड़ा शाखाओं को लाने के लिए --all पैरामीटर के साथ लाने के लिए आवश्यक प्रतीत होता है:

git svn fetch --all -r 10000:HEAD

4

इसके बजाय git-svn quirks से निपटने के लिए आप SubGit की कोशिश कर सकते हैं ।

एक को SubGit को Subversion रिपॉजिटरी में इंस्टॉल करना होता है। उसके बाद कोई विशेष git-svn कमांड का उपयोग करने के बजाय मानक git वर्कफ़्लो का उपयोग कर सकता है:

  1. धक्का देने के नए तरीके:

    Git-SVN:

    $ git commit
    $ git svn rebase
    $ git svn dcommit
    

    SubGit:

    $ git commit
    $ git push
    
  2. आने वाले बदलावों को लाना

    Git-SVN:

    $ git svn rebase
    

    SubGit:

    $ git pull [--rebase]
    
  3. एक नई शाखा बनाना:

    Git-SVN:

    $ git svn branch foo
    $ git checkout -b foo -t remotes/foo
    $ git commit
    $ git svn dcommit
    

    SubGit:

    $ git checkout -b foo
    $ git commit
    $ git push
    

देखें SubGit प्रलेखन अधिक जानकारी के लिए।


1
सबजीत का नुकसान यह है कि यह दो रिपोजिटरी बनाता है - एक svn, और एक "छाया" गिट रिपॉजिटरी। यह भारी SVN रिपॉजिटरी के लिए एक समस्या हो सकती है ...
Udo

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

1
@ कोई भी - कोई भी कंपनी अपने रिपॉजिटरी सर्वर को खरीदने के लिए तैयार नहीं है, एक हार्ड ड्राइव में उनकी प्राथमिकताएं गड़बड़ हैं। लेकिन विशाल रिपॉजिटरी वाली अधिकांश जगहें अपने रिपॉजिटरी को बहुत गंभीरता से लेती हैं, और रिपॉजिटरी के लिए डिस्क स्थान की आवश्यकताएं आमतौर पर एक बड़ा मुद्दा नहीं होती हैं, यहां तक ​​कि इतिहास के दशकों और लाखों कोड की दसियों लाइनों और सैकड़ों हजारों संशोधनों के साथ। यह उनकी मुख्य बौद्धिक संपदा का कंपनी का सबसे ठोस रूप है, और डिस्क स्थान बहुत सस्ती है। यह एक RAID नियंत्रक को अपग्रेड करने की आवश्यकता को ट्रिगर कर सकता है, लेकिन फिर भी, उत्पादकता में लाभ ...
Bob Kerns

@ केबर्न कर्नस - बिंदु यह है कि "आकार बुद्धिमान" एसवीएन और गिट और संगत नहीं है। यह डिस्क भंडारण का सवाल नहीं है। लेकिन आप एक विशाल एसवीएन रिपॉजिटरी के साथ काम कर सकते हैं क्योंकि आमतौर पर आपको केवल कुछ फाइलों / परियोजनाओं की जांच करने की आवश्यकता होती है। लेकिन आप एक विशाल गिट भंडार को क्लोन नहीं कर सकते हैं - यह कम से कम मजाक नहीं करता ;-) "विशाल" से मेरा मतलब है कई गिग्स।
उडो

2

Vjangus के उत्तर को जोड़ने के लिए, जिसने मुझे मदद की, मैंने उपयुक्त बिंदु पर शाखाओं को ट्रंक से जोड़ने के लिए git graft का उपयोग करना भी उपयोगी पाया - इतिहास को देखने और सही तरीके से मर्ज करने की अनुमति।

यह केवल .git/info/graftsहैश के साथ एक पंक्ति जोड़ने का मामला है :

<initial branch commit> <parent commit in trunk>

जैसे।

378b0ae0902f5c2d2ba230c429a47698810532e5 6c7144991381ce347d4e563e9912465700be0638

इसका श्रेय http://evan-tech.livejournal.com/255341.html को दिया जाता है

(मैं इसे एक टिप्पणी के रूप में जोड़ूंगा, लेकिन मेरी पर्याप्त प्रतिष्ठा नहीं है।)


0

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

मैं यह करता हूं:

git svn init -s <svn path with no trunk> local_repo
cd local_repo
git svn fetch 
## wait

उसके बाद, आप दूरस्थ शाखा में जा सकते हैं:

git checkout --track -b branch_name branch_name

तब आप स्वचालित रूप से अपनी शाखा में बदल जाएंगे।

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