SVN: एक्सटर्नल Git में बराबर?


177

मेरे पास svn का उपयोग करते हुए एक और SVN रिपॉजिटरी से उपयोग में दो SVN प्रोजेक्ट हैं : एक्सटर्नल

Git में मेरे पास समान रिपॉजिटरी लेआउट संरचना कैसे हो सकती है?


आपको गिट सबमॉडल्स में देखना चाहिए । यह लगभग वही होने देना चाहिए जो आप खोज रहे हैं।
foxxtrot

7
पिछले 4 वर्षों में किसी के पास इसका नया जवाब है, या आज की दुनिया भी यही है?
डग्वेल

4
@DougW हां, मेरे पास नीचे एक नया उत्तर है : git submoduleअब अनुकरण कर सकते हैं svn:external(मार्च 2013 के बाद से)।
वॉनक

Git के नवीनतम संस्करण के लिए मैं आधिकारिक Git प्रलेखन में Git सबमॉड्यूल के बारे में पढ़ने का सुझाव दूंगा
बुलाकी एस मासलोम

जवाबों:


134

Git के समान दो दृष्टिकोण हैं, लेकिन svn के बराबर नहीं: बाह्य:

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

  • Git सबमॉड्यूल्स ( मैनुअल ) किसी अन्य प्रोजेक्ट के रिपॉजिटरी में एक विशेष कमेंट के लिए लिंक, बहुत कुछ svn की तरह: एक-rतर्क केसाथ बाह्य। सबमॉड्यूल्स को स्थापित करना आसान है, लेकिन सभी उपयोगकर्ताओं को सबमॉड्यूल का प्रबंधन करना होगा, जो स्वचालित रूप से चेकआउट (या क्लोन) में शामिल नहीं हैं।
    हालाँकि अन्य प्रोजेक्ट में परिवर्तन वापस सबमिट करना आसान है, लेकिन ऐसा करने से रेपो में बदलाव होने पर समस्या हो सकती है। इसलिए आम तौर पर सक्रिय विकास के तहत एक परियोजना में परिवर्तन प्रस्तुत करना उचित नहीं है।


17
FYI करें, अब svn के साथ विशिष्ट संशोधन निर्दिष्ट करना संभव है: अब बाह्य (1.5 या 1.6 के बाद से मेरा विश्वास है?)
नैट पार्सन्स

9
FYI करें, git सबमॉड्यूल्स को स्वचालित रूप से प्रबंधित और कम्यूट किया जा सकता है। git एक .gitmodules फ़ाइल बनाता है जिसे / .ignignore फ़ाइल की तरह ही शुरू किया जाना चाहिए। अधिक जानकारी के लिए [ git-scm.com/book/en/Git-Tools-Submodules] देखें।
मिकिजॉव

5
@ नेटपैर्सन हमेशा सटीक संशोधन संख्या निर्दिष्ट करना संभव है svn:externals। संशोधन 1.5 के साथ, सिंटैक्स को अधिक लचीले प्रारूप में बदल दिया गया। क्या जोड़ा गया था रिश्तेदार यूआरएल एड्रेसिंग।
डेविड डब्ल्यू।

@ नैटपर्सन लेकिन क्या यह संभव है कि गिट सबमॉडल्स के साथ संशोधन किया जाए ...> _>
तर्जुक

मुझे लगता है कि svn: externals
user1911091

38

जैसा कि मैंने " Git सबमॉड्यूल न्यू वर्जन अपडेट " में उल्लेख किया है , आप Git 1.8.2 सबमॉड्यूल के साथ एक ही SVN बाहरी सुविधा प्राप्त कर सकते हैं :

git config -f .gitmodules submodule.<path>.branch <branch>

यह एक सबमॉड्यूल के लिए एक शाखा का पालन करने के लिए पर्याप्त है (जैसा कि किसी सबमॉडल अपस्ट्रीम रेपो के दूरस्थ शाखा के नवीनतम कमिट में )। आपको बस इतना करना चाहिए:

git submodule update --remote

जो सबमॉडल को अपडेट करेगा।

अधिक विवरण " git submoduleनवीनतम ट्रैकिंग " में हैं।

किसी मौजूदा सबमॉड्यूल को किसी एक शाखा में बदलने के लिए : " गिट सबमॉडल्स: एक शाखा / टैग निर्दिष्ट करें " में सभी चरणों को देखें ।


क्या आप की तरह आंशिक चेकआउट कर सकते हैं svn:externals?
अब

@nowox हाँ, आप सबमॉडल्स ( stackoverflow.com/a/17693008/6309 ) से संबंधित विरल चेकआउट (git 1.7+ stackoverflow.com/a/2372044/6309 )
VCC

दुर्भाग्य से सभी विरल चेकआउट संबंधित उत्तर कभी कोई उदाहरण नहीं देते हैं :( मैं इसके लिए एक जिस्ट उदाहरण लिखने की कोशिश करूंगा ...
nowox

इसके साथ अभी भी एक मुद्दा है। आपको अभी भी एक रिपॉजिटरी का पूरा इतिहास प्राप्त करना है जहां आपको केवल एक छोटे हिस्से की आवश्यकता है। मेरे मामले में 2GB पर 100kB है। मैं निश्चित रूप से उपयोग कर सकता हूं --depthलेकिन यह वास्तव में समस्या का समाधान नहीं करता है।
अब

@nowox एक नया सवाल पूछना सबसे अच्छा है जो बताता है कि आपका उपयोग मामला क्या है: मुझे कोई पता नहीं है कि क्या आपका 2GB रेपो एक सबमॉड्यूल या सबमॉडल वाला एक मुख्य रेपो है, और वास्तव में आपको इससे क्या निकालना है।
VonC

3

मैं gil (git लिंक) टूल का लेखक हूं

मेरे पास समस्या के लिए एक वैकल्पिक समाधान है - गिल (गिट लिंक) टूल

यह जटिल गिट रिपोजिटरी निर्भरता का वर्णन और प्रबंधन करने की अनुमति देता है।

इसके अलावा यह git पुनरावर्ती सबमॉडुल्स निर्भरता समस्या का समाधान प्रदान करता है

विचार करें कि आपके पास निम्नलिखित परियोजना निर्भरताएँ हैं: नमूना गिट रिपॉजिटरी निर्भरता ग्राफ

फिर आप .gitlinksरिपॉजिटरी रिलेशन विवरण के साथ फाइल को परिभाषित कर सकते हैं :

# Projects
CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master
CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master
CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master

# Modules
Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master
cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master
fmt modules/fmt https://github.com/fmtlib/fmt.git master
HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master
zlib modules/zlib https://github.com/madler/zlib.git master

# Scripts
build scripts/build https://github.com/chronoxor/CppBuildScripts.git master
cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master

प्रत्येक लाइन निम्नलिखित प्रारूप में गिट लिंक का वर्णन करती है:

  1. भंडार का अनोखा नाम
  2. रिपॉजिटरी का सापेक्ष पथ (.gitlinks फ़ाइल के पथ से शुरू)
  3. Git रिपॉजिटरी जो git क्लोन कमांड रिपोजिटरी ब्रांच में चेकआउट करने के लिए इस्तेमाल की जाएगी
  4. # के साथ शुरू की गई खाली लाइन या लाइन को पार्स नहीं किया जाता है (टिप्पणी के रूप में माना जाता है)।

अंत में आपको अपना रूट सैंपल रिपॉजिटरी अपडेट करना होगा:

# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link

# The same result with a single command
gil update

परिणामस्वरूप आप सभी आवश्यक परियोजनाओं का क्लोन बना लेंगे और उन्हें एक दूसरे से उचित तरीके से जोड़ लेंगे।

यदि आप बच्चे से जुड़े भंडार में सभी परिवर्तनों के साथ कुछ भंडार में सभी परिवर्तन करना चाहते हैं, तो आप इसे एक ही आदेश के साथ कर सकते हैं:

gil commit -a -m "Some big update"

पुल, पुश कमांड एक समान तरीके से काम करता है:

gil pull
gil push

गिल (गिट लिंक) उपकरण निम्नलिखित आदेशों का समर्थन करता है:

usage: gil command arguments
Supported commands:
    help - show this help
    context - command will show the current git link context of the current directory
    clone - clone all repositories that are missed in the current context
    link - link all repositories that are missed in the current context
    update - clone and link in a single operation
    pull - pull all repositories in the current directory
    push - push all repositories in the current directory
    commit - commit all repositories in the current directory

गिट पुनरावर्ती सबमोडुल्स निर्भरता समस्या के बारे में अधिक ।


1
आपको यह कहते हुए पोस्ट के शीर्ष पर एक अस्वीकरण रखना चाहिए कि आप इसके लेखक हैं gil
डैनियल कामिल कोजार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.