क्या यह एक सबट्रोस रिपॉजिटरी के रूप में Git सबमॉड्यूल के लिए संभव है?


154

क्या मेरी गिट रिपॉजिटरी में Git सबमॉड्यूल के रूप में एक सबवर्सन रिपॉजिटरी जोड़ने का कोई तरीका है?

कुछ इस तरह:

git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project

जहां https://svn.foo.com/svn/projएक सबवर्सन रिपॉजिटरी की ओर इशारा किया गया है।

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

जवाबों:


127

नहीं, आपका सबसे अच्छा दांव एक समर्पित गिट रिपॉजिटरी में svn रिपॉजिटरी का एक दर्पण स्थापित करना होगा।

git svn clone -s http://subversion.example.com/ mysvnclone
cd mysvnclone
git remote add origin git@example.com:project.git
git push origin master

फिर आप मूल परियोजना के लिए एक उपप्रकार के रूप में गिट रिपॉजिटरी को जोड़ सकते हैं

cd /path/to/gitproject
git submodule add git://example.com/project.git -- svn-project
git add svn-project
git commit -m "Add submodule"

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

इसलिए जब हम अपस्ट्रीम तोड़फोड़ के साथ पुन: पेश करते हैं:

cd /path/to/mysvnclone
git svn rebase
git push

... गिट परियोजना अभी भी मूल संशोधन का उपयोग करेगी जो हमने पहले किया था। Svn सिर को अद्यतन करने के लिए, आपको उपयोग करना होगा

cd /path/to/gitproject/svn-project
git checkout master
git pull
cd ..
git add svn-project
git commit -m"Update submodule"

1
क्या आपने यहाँ पर पोस्ट करने से पहले इन कोड को आज़माया है? सबमॉडल्स git svn पर ठीक से काम नहीं कर सकते हैं।
xhan

4
@xhan हाँ, और मैं समान रिपॉजिटरी में git-svn और submodules को मिलाने की वकालत नहीं कर रहा हूँ। क्लोन जो git-svn का उपयोग करता है वह svn रिपॉजिटरी का एक देशी git क्लोन बनाने के लिए केवल एक पुल है।
ऋचीक

माफ़ करना। मैंने आपको सबमॉडल्स के रूप में कार्य करने के लिए दो फ़ोल्डरों का उपयोग नहीं किया है। अच्छी चाल।
xhan

अच्छी तकनीक है। क्या आपको git-svn repo को आगे बढ़ाने से पहले सर्वर पर 'git init --bare' चरण की आवश्यकता नहीं है? मुझे यह करना था।
क्लेटन स्टेनली

यह शायद डिफ़ॉल्ट नहीं है, लेकिन आप svn को बांध सकते हैं: बाह्य संशोधन एक विशिष्ट संशोधन के लिए जैसे गिट सबमॉड्यूल करते हैं।
मार्ख

8

मैं बस इसके माध्यम से चला गया। मैं rq के समान कुछ कर रहा हूं, लेकिन थोड़ा अलग। मैंने अपने सर्वर में से एक को svn repos के इन git क्लोन को होस्ट करने के लिए सेटअप किया है जिनकी मुझे आवश्यकता है। मेरे मामले में मुझे केवल-केवल संस्करण चाहिए, और सर्वर पर एक नंगे रेपो की आवश्यकता है।

मेरे द्वारा चलाए जा रहे सर्वर पर:

GIT_DIR=<projectname>.git git init
cd <projectname>.git/
GIT_DIR=. git svn init svn://example.com/trunk
GIT_DIR=. git svn fetch
git gc

यह मेरे नंगे रेपो को सेट करता है, फिर मेरे पास इसे अपडेट करने के लिए एक क्रोन स्क्रिप्ट है:

#!/usr/bin/python

import os, glob

GIT_HOME='/var/www/git'

os.chdir(GIT_HOME)
os.environ['GIT_DIR']='.'
gits = glob.glob('*.git')
for git in gits:
  if not os.path.isdir(git):
    continue
  os.chdir(os.path.join(GIT_HOME, git))
  if not os.path.isdir('svn/git-svn'):
    #Not a git-svn repo
    continue

  #Pull in svn updates
  os.system('git svn fetch && git gc --quiet')
  #fix-svn-refs.sh makes all the svn branches/tags pullable
  os.system('fix-svn-refs.sh')
  #Update the master branch
  os.system('git fetch . +svn/git-svn:master && git gc --quiet')`

इसके लिए भी http://www.shatow.net/fix-svn-refs.sh से fix-svn-refs.sh की आवश्यकता होती है यह ज्यादातर से प्रेरित था: http://gsocblog.jsharpe.net/archives/12

मुझे यकीन नहीं है कि git gcयहाँ इसकी आवश्यकता क्यों है, लेकिन मैं git pullइसके बिना ऐसा करने में सक्षम नहीं था ।

तो इस सब के बाद आप rq के निर्देशों के बाद git सबमॉड्यूल का उपयोग कर सकते हैं।


एक आपको लगता है कि आप इसे कमिट के रूप में भी कर सकते हैं।
एंड्रेस जान टैक

6

वर्तमान में git-svn svn का समर्थन नहीं करता है : बाहरी । लेकिन दो अन्य उपकरण हैं जो आपकी मदद कर सकते हैं:

  1. SubGit

    SubGit सर्वर-साइड समाधान है, यह Git को Subversion रिपॉजिटरी और इसके विपरीत तक पहुँच में सक्षम बनाता है। आप अधिक विवरण के लिए डॉक्यूमेंटेशन का उल्लेख कर सकते हैं , लेकिन सामान्य तौर पर SubGit का उपयोग करना काफी आसान है:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    एसवीएन परियोजना में उपरोक्त कमांड शाखाओं के लेआउट का पता लगाएगी और फिर एसवीएन परियोजना को तैयार करने के लिए खाली नंगे गिट रिपॉजिटरी का निर्माण करेगी। आपको क्रेडेंशियल के लिए कहा जा सकता है जब तक कि वे पहले से ही एसवीएन क्रेडेंशियल्स कैश में ~ / .subversion डायरेक्टरी में संग्रहीत न हों। आप $GIT_REPO/subgit/authors.txtएसवीएन लेखक के नामों को गिट पहचान में समायोजित कर सकते हैं।

    $ subgit install $GIT_REPO
    $ ... let initial translation complete ... 
    $ TRANSLATION SUCCESSFUL
    

    इस समय आपके पास नई निर्मित गिट रिपॉजिटरी से जुड़ी सबवर्सन रिपॉजिटरी है। सबजीत एसवीएन संशोधन को हर पर svn commitजीआईटी कमिट में और हर पर एसवीएन संशोधन में प्रतिबद्ध करता है git push

आगे आपको जो कुछ भी चाहिए वह जीआईटी भंडार को उपलब्ध कराने के लिए है। इसके लिए git-http-backend पर एक नज़र डालें । फिर आप एक सामान्य सबमॉड्यूल के रूप में बनाई गई गिट रिपॉजिटरी को जोड़ सकते हैं। SubGit Bitbucket सर्वर के लिए ऐड-ऑन के रूप में भी उपलब्ध है, यह जानने के लिए कि यहां और अधिक जाँच करें । इसलिए, किसी भी बाहरी उपकरण जैसे कि git-svn या किसी अन्य का उपयोग करने की आवश्यकता नहीं है ।

सबजीट मालिकाना सॉफ्टवेयर है लेकिन यह छोटी कंपनियों (10 कमिटर्स तक), अकादमिक और ओपन-सोर्स प्रोजेक्ट्स के लिए मुफ्त है।

  1. SmartGit

    SmartGit क्लाइंट-साइड पर git-svn की जगह लेता है । इसकी विशेषताओं के बारे में अधिक जानकारी आपको यहां मिल सकती है

    विशेष रूप से दोनों का समर्थन करता है SmartGit Git submodules और SVN: बाहरी , आप उन्हें अपने भंडार में मिश्रण कर सकते हैं।

    स्मार्टगिट मालिकाना सॉफ्टवेयर है लेकिन यह गैर-व्यावसायिक उपयोग के लिए मुफ्त है।


दोनों subgit( subgit.com/documentation/… ) और काम की कॉपी में एक स्पष्ट फ़ाइल द्वारा उसी तरह से smartgitसमर्थन करता है। जिसका अर्थ है कि आपको अभी भी इन सॉफ्टवेयरों का उपयोग बाहरी चेकआउट करने के लिए करना है और आप बाहरी उपयोगिता का उपयोग किसी बाहरी गिट हब सर्वर जैसे या से सीधे चेकआउट करने के लिए नहीं कर सकते हैं । तो एक बाहरी git हब सर्वर पर संबंधित स्रोत इन सॉफ्टवेयर के बिना अवलोकन योग्य और डाउनलोड करने योग्य नहीं होंगे जो अभी भी एक महत्वपूर्ण मुद्दा है। svn:externals.gitsvnextmodulesgitgithubgitlabsnv:externals
एंड्री

4

Rq ने जो कहा, इसके अलावा, एक अन्य विधि तीसरे पक्ष के "एक्सटर्नल" प्रोजेक्ट ( http://nopugs.com/ext-tutorial ) का उपयोग करना होगा , जो कि बेहतर है कि svn बाहरी संदर्भ कैसे काम करते हैं। एक्सटर्नल के साथ आप या तो git या svn रिपॉजिटरी को ट्रैक कर सकते हैं, और उन रिपॉजिट के लिए अपने परिवर्तनों को ऊपर की ओर धकेलना आसान लगता है। हालाँकि, इसे अलग पैकेज को डाउनलोड करने और स्थापित करने के लिए परियोजना सदस्यों की आवश्यकता होती है।

मैंने अभी तक सबमॉड्यूल्स या एक्सटर्नल का उपयोग नहीं किया है; हालाँकि, मैंने सभी विकल्पों के बारे में पढ़ते हुए कुछ घंटे बिताए हैं और ऐसा लग रहा है कि बाहरी चीज़ें मेरी ज़रूरतों के लिए बेहतर होंगी। जॉन लोएलिगर ( http://oreilly.com/catalog/9780596520120 ) द्वारा "वर्जन कंट्रोल विथ गिट" के अध्याय 15 में इन और अन्य कस्टम तरीकों के बारे में एक उत्कृष्ट चर्चा है , जिसकी मैं दृढ़ता से सिफारिश करता हूं।


0

पिस्टन को इसका समर्थन करने के लिए फिर से लिखा जा रहा है, और इसके साथ ही, सबवर्सन रिपॉजिटरी में मौजूदा सबवर्सन URL और git + git।

की जाँच करें पिस्टन Github रिपॉजिटरी

दुर्भाग्य से यह जारी नहीं किया गया लगता है।


3
पिस्टन आपके चेहरे पर तब विफल हो जाएगा जब आपको इसकी सबसे अधिक आवश्यकता होगी;), इसलिए मैं इसकी अनुशंसा नहीं करता। इसके अलावा पिस्टन के लिए अब कोई बगफिक्स नहीं हैं।
हेनरिक

0

खैर, वहाँ है git-remote-testsvn, तो मुझे लगता है जैसे कुछ

git submodule add testsvn::http://www.telegraphics.com.au/svn/bzquips/trunk/ \
    module/bzquips

कार्य करना चाहिए। क्या यह?

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