गिट सबमॉड्यूल और सबट्री के बीच अंतर


300

गिट सबमॉड्यूल और सबट्री का उपयोग करने के बीच वैचारिक मतभेद क्या हैं?

प्रत्येक के लिए विशिष्ट परिदृश्य क्या हैं?


2
यह आपके सभी सवालों का जवाब नहीं दे सकता है लेकिन इस विषय पर दिलचस्प पढ़ना है: blogs.atlassian.com/2013/05/…
Chop


"Git submodules करने के लिए विकल्प?": Stackoverflow.com/questions/6500524/...
brillout

जवाबों:


177

क्या होगा यदि मैं चाहता हूं कि लिंक हमेशा बाहरी रेपो के HEAD को इंगित करें?

आप सबमॉडल रिमोट रेपो की एक शाखा के हेड का अनुसरण करने के लिए एक सबमॉड्यूल बना सकते हैं:

git submodule add -b <branch> <repository> [<path>]। (पालन करने के लिए एक शाखा निर्दिष्ट करने के लिए)
git submodule update --remoteजो <repository>/<branch>डिफ़ॉल्ट रूप से नवीनतम HEAD से सबमॉड्यूल की सामग्री को अपडेट करेगा origin/master। आपकी मुख्य परियोजना अभी भी सबमॉडल के हेड के हैश को ट्रैक करेगी भले ही --remoteइसका उपयोग किया जाता हो।



आपका जवाब यहाँ दिए गए वोट के जवाब के खिलाफ जाता है: stackoverflow.com/questions/10443627/…
नाथन एच

@NathanH इसे (HEAD को ट्रैक करने की संभावना) एक साल बाद (मार्च 2013, git 1.8.2: github.com/git/git/blob/… ) जोड़ा गया है
VonC

मैं देख रहा हूं कि आपके अन्य awer में सबमॉडल फॉलोइंग व्यवहार का भी उल्लेख किया गया है । उस स्थिति में मुझे लगता है कि आपके कहने का मतलब यह है कि हमेशा सबमॉड्यूल के HEAD की ओर इशारा करते हुए , सबमॉड्यूल अपडेट डॉक्यूमेंट के अनुसार, अपडेट कमांड्स पर add -bऔर --remoteउसके बाद दोनों का उपयोग करके पूरा किया जाता है । उस मामले में, क्या वास्तव में मास्टर के HEAD के लिए अभी भी आवश्यक है? -b
मटनस्टर

@matt -bका उपयोग सबमॉडल के लिए सही (.Itmodule मेटाडेटा) उत्पन्न करने के लिए किया जाता है (यह a के बराबर है git config -f .gitmodules submodule.<path>.branch <branch>)।
VonC

फिर इसे सक्षम करने के लिए बहुत कम है --remote- --remoteकाम करता है अगर यह भी -bइस्तेमाल नहीं किया गया है add। दोनों मामलों में अद्यतन माता-पिता रेपो हाउसिंग सबमॉडल में एक कमिट का कारण बनेगा, इसलिए लिंक वास्तव में "हमेशा HEAD को इंगित नहीं करता है" बहुत ही स्वचालित तरीके से .... या तो मुझे यह नहीं मिला, या वह दावा बेहतर मूल उत्तर (?) से हटाया जा सकता है
matanster


121

वैचारिक अंतर है:

गिट सबमॉड्यूल के साथ आप आम तौर पर एक बड़े भंडार को छोटे लोगों में अलग करना चाहते हैं। एक सबमॉडल को संदर्भित करने का तरीका मावेन-शैली है - आप दूसरे (सबमॉड्यूल) रिपॉजिटरी से एक एकल कमिट का संदर्भ दे रहे हैं। यदि आपको सबमॉड्यूल के भीतर एक बदलाव की आवश्यकता है, तो आपको सबमॉड्यूल के भीतर एक कमिट / पुश करना होगा, फिर मुख्य रिपॉजिटरी में नई कमिट का संदर्भ लें और फिर मुख्य रिपॉजिटरी के बदले हुए संदर्भ को कमिट / पुश करें। इस तरह आपको पूर्ण निर्माण के लिए दोनों रिपॉजिटरी तक पहुंच प्राप्त करनी होगी।

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


लेकिन git subtreeआप के साथ अभी भी धक्का दे सकते हैं - अगर आप चाहते थे - सही?
Ixx

@ XXX यदि आप रिपॉजिटरी URL जानते हैं ...
फ्रैंकलिन यू

@FranklinYu वह क्यों नहीं जानता होगा? स्थानीय git मेटा डेटा से वह जानकारी नहीं मिल सकती है?
adi518

@ adi518 हाँ, यदि आप वह हैं, जिसने सबट्री बनाई है। हालाँकि, यदि आपने अपने रिपॉजिटरी को GitHub और अन्य लोगों के लिए इसे नीचे धकेल दिया है, तो मुझे नहीं लगता कि वह स्वचालित रूप से उपशीर्षक URL को जानता है।
फ्रैंकलिन यू

@NiklasP - क्या आप "मुख्य भंडार में नई प्रतिबद्धता का संदर्भ" पर विस्तार से बता सकते हैं? यह एक ऐसा कदम है, जिस पर मैं अमल नहीं कर पा रहा हूं और इसलिए "बदला हुआ संदर्भ" कुछ ऐसा नहीं है जिसे मैं या तो समझता हूं।
रॉबर्ट ओस्क्लर

21

उप-मॉड्यूल
को रिमोट में मुख्य रेपो को धकेलने से उप-मॉड्यूल की फ़ाइलों को धक्का नहीं पड़ता है

उप-पेड़
एक मुख्य रेपो को दूरस्थ धकेलने के लिए उप-ट्री की फ़ाइलों को धकेलता है


3
"एक मुख्य रेपो को दूरस्थ रूप से उप-पेड़ की फ़ाइलों को धकेलना" नहीं, यह नहीं है।
जे। ब्रम्बल

@JBramble मुझे शायद यह उल्लेख करना चाहिए कि यह SourceTree ऐप के साथ किया गया है जैसे:git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
Maciek Rek
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.