उथले गिट सबमॉडल्स कैसे बनाएं?


139

क्या उथले सबमॉड्यूल होना संभव है? मेरे पास कई सबमॉडल्स के साथ एक सुपरप्रोजेक्ट है, प्रत्येक एक लंबा इतिहास है, इसलिए यह अनावश्यक रूप से उस सभी इतिहास को बड़ा खींचता है।

मैंने पाया है कि यह अनुत्तरित धागा है

क्या मुझे इसे लागू करने के लिए सिर्फ git-submodule को हैक करना चाहिए ?


1
" git submodule add/update" अब सबमॉड्यूल रिपॉजिटरी को धीरे-धीरे क्लोन कर सकता है! देखें नीचे मेरा उत्तर
VonC

जवाबों:


133

आगामी git1.8.4 में नया (जुलाई 2013) :

" git submodule update" वैकल्पिक रूप से सबमॉड्यूल रिपॉजिटरी को उथले रूप से क्लोन कर सकता है।

(और git 2.10 Q3 2016 के साथ रिकॉर्ड करने की अनुमति देता है git config -f .gitmodules submodule.<name>.shallow true
इस उत्तर का अंत देखें)

देखें 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f प्रतिबद्ध :

--depth"Git सबमॉड्यूल" के ऐड और अपडेट कमांड का विकल्प जोड़ें , जिसे बाद में क्लोन कमांड पर पास किया जाता है। यह तब उपयोगी होता है जब सबमोडुले (s) विशाल होते हैं और आपको वास्तव में किसी भी चीज में दिलचस्पी नहीं होती है लेकिन नवीनतम प्रतिबद्ध होते हैं।

टेस्ट जोड़े जाते हैं और कुछ इंडेक्शन एडजस्टमेंट को बाकी टेस्टफाइल के अनुरूप बनाया जाता है, "सबमॉड्यूल अपडेट pwd में प्रतीकात्मक लिंक को हैंडल कर सकता है"।

साइन-ऑफ-बाय: फ्रेड्रिक गुस्ताफसन <iveqy@iveqy.com>
एकेड-बाय: जेन्स लेहमन<Jens.Lehmann@web.de>

इसका मतलब है कि यह काम करता है:

git submodule add --depth 1 -- repository path
git submodule update --depth -- [<path>...]

साथ में:

--depth::

यह विकल्प addऔर updateआदेशों के लिए मान्य है ।
एक 'उथले' क्लोन का निर्माण करें जिसमें इतिहास को संशोधित संख्या में संशोधित किया गया हो।


atwyman टिप्पणियों में जोड़ता है :

जहां तक ​​मैं बता सकता हूं कि यह विकल्प सबमॉडल्स के लिए उपयोग करने योग्य नहीं है जो masterबहुत बारीकी से ट्रैक नहीं करते हैं। यदि आप गहराई 1 सेट करते हैं, तो submodule updateकेवल तभी सफल हो सकता है जब आप जिस सबमॉड्यूल के लिए प्रतिबद्ध हैं वह नवीनतम मास्टर है। अन्यथा आपको " fatal: reference is not a tree" मिलता है

यह सच है।
यही है, जब तक git 2.8 (मार्च 2016)। 2.8 के साथ, submodule update --depthसफल होने के लिए एक और मौका है, भले ही SHA1 रिमोट रेपो हेड्स में से एक से सीधे पहुंच रहा हो।

Stefan Beller ( ) द्वारा प्रतिबद्ध fb43e31 (24 फ़रवरी 2016) देखें । हेल्प-बाय: जूनियो सी हमानो ( )(द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध 9671a76 , 26 फ़र 2016)stefanbeller
gitster
gitster

submodule: सीधे लाने के लिए कठिन प्रयास करना चाहिए

जब एक परिवर्तन की समीक्षा की जाती है जो गेरिट में एक सबमॉड्यूल को अपडेट करता है, तो एक सामान्य समीक्षा अभ्यास पैच को स्थानीय रूप से परीक्षण करने के लिए डाउनलोड और चुनना है।
हालाँकि, इसका स्थानीय स्तर पर परीक्षण करने पर, ' git submodule update' सही सबमॉडल sha1 लाने में विफल हो सकता है क्योंकि सबमॉड्यूल में संबंधित वचन अभी तक परियोजना के इतिहास का हिस्सा नहीं है, लेकिन सिर्फ एक प्रस्तावित बदलाव भी है।

यदि $sha1हम डिफ़ॉल्ट लाने का हिस्सा नहीं थे, तो हम $sha1सीधे लाने की कोशिश करते हैं । कुछ सर्वर हालांकि sha1 द्वारा सीधे लाने का समर्थन नहीं करते हैं, जो git-fetchजल्दी विफल हो जाता है।
हम यहां खुद को विफल कर सकते हैं क्योंकि अभी भी लापता sha1 चेकआउट चरण में बाद में किसी भी तरह से विफलता का कारण बन जाएगा, इसलिए यहां असफल होना उतना ही अच्छा है जितना हम प्राप्त कर सकते हैं।


MVG बताते टिप्पणी में करने के लिए प्रतिबद्ध fb43e31 (Git 2.9, फ़रवरी 2016)

यह मेरे लिए प्रतीत होता है कि fb43e31 SHA1 आईडी द्वारा लापता होने का अनुरोध करता है, इसलिए सर्वर पर सेटिंग्स uploadpack.allowReachableSHA1InWantऔर uploadpack.allowTipSHA1InWantसेटिंग्स शायद यह प्रभावित करती हैं कि क्या यह काम करता है।
मैंने आज git सूची में एक पोस्ट लिखी है , जिसमें बताया गया है कि कैसे उथले सबमॉड्यूल्स का उपयोग कुछ परिदृश्यों के लिए बेहतर काम करने के लिए किया जा सकता है, अर्थात् यदि कमिट भी एक टैग है।
चलो इन्तेजार करके देखते है।

मुझे लगता है कि यह एक कारण है कि fb43e31 ने एक विशिष्ट SHA1 के लिए भ्रूण को डिफ़ॉल्ट शाखा के लिए लाने के बाद एक वापसी की।
फिर भी, "--depth 1" के मामले में, मुझे लगता है कि यह जल्दी से गर्भपात करने के लिए समझ में आता है: यदि सूचीबद्ध में से कोई भी अनुरोध किए गए मेल से मेल नहीं खाता है, और SHA1 द्वारा पूछना सर्वर द्वारा समर्थित नहीं है, तो इसमें कोई मतलब नहीं है किसी भी चीज को लाना, क्योंकि हम सबमॉडल की आवश्यकता को किसी भी तरह से संतुष्ट नहीं कर पाएंगे।


अगस्त 2016 को अपडेट करें (3 साल बाद)

Git 2.10 (Q3 2016) के साथ, आप कर पाएंगे

 git config -f .gitmodules submodule.<name>.shallow true

अधिक के लिए " अतिरिक्त वजन के बिना गिट उपमॉडल " देखें ।


Git 2.13 (Q2 2017) में जोड़ सकता हूँ 8d3047c प्रतिबद्ध द्वारा (19 अप्रैल 2017) सेबस्टियन Schuberth ( sschuberth)
(द्वारा विलय सेबस्टियन Schuberth - sschuberth- में 8d3047c प्रतिबद्ध , 20 अप्रैल 2017)

इस सबमॉडल का एक क्लोन उथले क्लोन के रूप में किया जाएगा (1 की इतिहास गहराई के साथ)

हालाँकि, Ciro Santilli टिप्पणियों में जोड़ता है (और उनके उत्तर में विवरण )

shallow = trueपर .gitmodulesउसे प्रभावित करती है संदर्भ का उपयोग करते समय दूरदराज के प्रमुख द्वारा पता लगाया --recurse-submodules, लक्ष्य के लिए प्रतिबद्ध है, भले ही एक शाखा द्वारा की ओर इशारा किया है, और भले ही आप डाल branch = mybranchपर .gitmodulesके रूप में अच्छी तरह से।


Git 2.20 (Q4 2018) submodule समर्थन, पर ब्लॉब से पढ़ने के लिए अद्यतन किया गया है, जिस पर बेहतर बनाता है HEAD:.gitmodulesजब .gitmodulesफ़ाइल काम कर पेड़ से लापता है।

देखें 2b1257e प्रतिबद्ध , 76e9bdc प्रतिबद्ध (25 अक्टू 2018), और b5c259f प्रतिबद्ध , 23dd8f5 प्रतिबद्ध , b2faad4 प्रतिबद्ध , 2502ffc प्रतिबद्ध , 996df4d प्रतिबद्ध , d1b13df प्रतिबद्ध , 45f5ef3 प्रतिबद्ध , प्रतिबद्ध bcbc780 (05 अक्टू 2018) द्वारा एंटोनियो Ospite ( ao2)
( जूनियो सी gitsterहमानो द्वारा विलय - - in abb4824 , 13 Nov 2018)

submodule: पढ़ने का समर्थन .gitmodulesजब यह काम कर रहे पेड़ में नहीं है

जब .gitmodulesफ़ाइल काम कर रहे पेड़ में उपलब्ध नहीं है, तो सूचकांक से सामग्री का उपयोग करने की कोशिश करें और वर्तमान शाखा से।
यह उस मामले को कवर करता है जब फ़ाइल रिपॉजिटरी का हिस्सा होती है लेकिन किसी कारण से इसे चेक आउट नहीं किया जाता है, उदाहरण के लिए एक विरल चेकआउट के कारण।

यह कम से कम ' git submodule' कमांड का उपयोग करना संभव बनाता है जो वर्किंग ट्री को पूरी तरह से आबाद किए बिना कॉन्फ़िगरेशन फ़ाइल को पढ़ता है gitmodules

लिखने के लिए .gitmodulesअभी भी फ़ाइल की जाँच करने की आवश्यकता होगी, इसलिए कॉल करने से पहले उसके लिए जाँच करें config_set_in_gitmodules_file_gently

समान रूप से एक चेक भी जोड़ें git-submodule.sh::cmd_add()" git submodule add" कमांड की अंतिम विफलता का अनुमान लगाने के लिए जब .gitmodulesसुरक्षित रूप से लेखन योग्य नहीं है; यह आदेश को एक स्थान पर रिपॉजिटरी को छोड़ने से रोकता है (उदाहरण के लिए सबमॉड्यूल रिपॉजिटरी को क्लोन किया गया था लेकिन असफल होने के .gitmodulesकारण अपडेट नहीं किया गया था config_set_in_gitmodules_file_gently)।

इसके अलावा, चूंकि config_from_gitmodules()अब वैश्विक ऑब्जेक्ट स्टोर तक पहुंच है, इसलिए सभी कोड रास्तों की रक्षा करना आवश्यक है, जो फ़ंक्शन को वैश्विक सुरक्षा स्टोर तक पहुंच के खिलाफ कहते हैं।
वर्तमान में यह केवल में होता है builtin/grep.c::grep_submodules(), इसलिए grep_read_lock()कोड शामिल करने से पहले कॉल करें config_from_gitmodules()

नोट: एक दुर्लभ मामला है जहां यह नई सुविधा अभी तक ठीक से काम नहीं करती है: नेस्टेड सबमॉड्यूल .gitmodulesउनके काम के पेड़ के बिना ।


नोट: Git 2.24 (Q4 2019) एक सबमॉड्यूल उथले को क्लोन करते समय एक संभावित सेगफॉल्ट को ठीक करता है।

अली Utku सेलेन ( ) द्वारा प्रतिबद्ध ddb3c85 (30 सितंबर 2019) देखें । (द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध 678a9ca , 09 अक्टू 2019)auselen
gitster


Git 2.25 (Q1 2020), git submodule updateप्रलेखन को स्पष्ट करता है।

फिलिप ब्लेन ( ) द्वारा प्रतिबद्ध f0e58b3 (24 नवंबर 2019) देखें । ( जूनियो सी हमानो द्वारा विलय - - कम से कम एफई ६१०४५ , ०५ दिसंबर २०१ ९)phil-blain
gitster

doc: उल्लेख है कि 'git सबमॉड्यूल अपडेट' के लापता होने की सूचना मिलती है

हेल्प-बाय: जूनियो सी हमानो हेल्प
-बाय: जोहान्स शिंडेलिन ने
हस्ताक्षर किए-ऑफ-ऑफ: फिलिप कोन

सुपरप्रोजेक्ट में दर्ज SHA-1 नहीं मिलने पर ' git submoduleअपडेट' सबमॉडल रिमोट से नया संचार करेगा । प्रलेखन में इसका उल्लेख नहीं किया गया था।


चेतावनी: Git 2.25 (Q1 2020) के साथ, " git clone --recurse-submodules" और वैकल्पिक ऑब्जेक्ट स्टोर के बीच की बातचीत को डिजाइन किया गया था।

जब उपयोगकर्ता विफलताओं को देखते हैं तो अधिक स्पष्ट सिफारिशें करने के लिए प्रलेखन और कोड सिखाया गया है।

देखें 4f3e57e प्रतिबद्ध , प्रतिबद्ध 10c64a0 द्वारा (02 दिसंबर 2019) जोनाथन टैन ( jhowtan)
(द्वारा विलय Junio सी Hamano - gitster- में प्रतिबद्ध 5dd1d59 , 10 दिसंबर 2019)

submodule--helper: घातक वैकल्पिक त्रुटि पर सलाह

साइन-ऑफ-बाय: जोनाथन टैन
एकेड-बाय: जेफ किंग

जब एक सुपरप्रोजेक्ट को कुछ उथले मॉड्यूल से परिभाषित करते हुए पुनरावर्ती किया जाता है .gitmodules, तो " --reference=<path>" के साथ पुनरावृत्ति , एक त्रुटि उत्पन्न होती है। उदाहरण के लिए:

git clone --recurse-submodules --branch=master -j8 \
  https://android.googlesource.com/platform/superproject \
  master
git clone --recurse-submodules --branch=master -j8 \
  https://android.googlesource.com/platform/superproject \
  --reference master master2

के साथ विफल रहता है:

fatal: submodule '<snip>' cannot add alternate: reference repository
'<snip>' is shallow

जब सुपरप्रोजेक्ट के वैकल्पिक से गणना की गई वैकल्पिक को जोड़ा नहीं जा सकता है, चाहे इस मामले में या किसी अन्य, क्लोनिंग करते समय " submodule.alternateErrorStrategy" कॉन्फ़िगरेशन विकल्प को कॉन्फ़िगर करने और " --reference-if-able" के बजाय " " का उपयोग करने के बारे में सलाह दें --reference

यह विस्तृत है:

2.25 Git (Q1 2020) के साथ, "git क्लोन --recurse-submodules" और वैकल्पिक ऑब्जेक्ट स्टोर के बीच की बातचीत को डिजाइन किया गया था।

Doc: submodule.alternateErrorStrategy समझाएं

साइन-ऑफ-बाय: जोनाथन टैन
एकेड-बाय: जेफ किंग

प्रतिबद्ध 31224cbdc7 (" clone: पुनरावर्ती और संदर्भ विकल्प सबमॉडल विकल्प को ट्रिगर करता है", 2016-08-17, Git v2.11.0-rc0 - बैच में सूचीबद्ध मर्ज # 1 ) ने एक सुपरप्रोजेक्ट पर कॉन्फ़िगरेशन विकल्प " submodule.alternateLocation" और " submodule.alternateErrorStrategy" का समर्थन करने के लिए सिखाया। ।

यदि किसी सुपरप्रोजेक्ट पर submodule.alternateLocation" superproject" को " " कॉन्फ़िगर किया जाता है , तो जब भी उस सुपरप्रोजेक्ट का एक सबमॉड्यूल क्लोन किया जाता है, तो वह सुपरप्रोजेक्ट से उस सबमॉड्यूल के लिए अनुरूप वैकल्पिक पथ की गणना करता है $GIT_DIR/objects/info/alternatesऔर इसका संदर्भ देता है।

" submodule.alternateErrorStrategy" विकल्प निर्धारित करता है कि क्या होता है यदि उस वैकल्पिक को संदर्भित नहीं किया जा सकता है।
हालांकि, यह स्पष्ट नहीं है कि क्लोन आगे बढ़ता है जैसे कि कोई विकल्प निर्दिष्ट नहीं किया गया था जब वह विकल्प "डाई" पर सेट नहीं होता है (जैसा कि 31224cbdc7 में परीक्षणों में देखा जा सकता है )।
इसलिए, तदनुसार दस्तावेज़।

Config submodule प्रलेखन अब में शामिल हैं:

submodule.alternateErrorStrategy::

निर्दिष्ट करता है कि एक सबमॉड्यूल के लिए वैकल्पिक के साथ त्रुटियों का इलाज कैसे किया जाए submodule.alternateLocation
संभावित मान हैं ignore, info, die
डिफ़ॉल्ट है die
ध्यान दें कि यदि सेट किया गया है , ignoreया यदि गणना किए गए वैकल्पिक के साथ कोई त्रुटि है, तो क्लोन आगे बढ़ता है जैसे कि कोई वैकल्पिक निर्दिष्ट नहीं किया गया थाinfo


2
वाह, यह तेज़ था! वैसे जवाब के लिए Thx। ओह और --depthशॉडल एक तर्क भी लेते हैं;)
ब्राइस

3
यह मेरे लिए प्रतीत होता है कि fb43e31 SHA1 आईडी द्वारा लापता होने का अनुरोध करता है, इसलिए सर्वर पर सेटिंग्स uploadpack.allowReachableSHA1InWantऔर uploadpack.allowTipSHA1InWantसेटिंग्स शायद यह प्रभावित करती हैं कि क्या यह काम करता है। मैंने आज git सूची में एक पोस्ट लिखी है, जिसमें बताया गया है कि कैसे उथले सबमॉड्यूल्स का उपयोग कुछ परिदृश्यों के लिए बेहतर काम करने के लिए किया जा सकता है, अर्थात् यदि कमिट भी एक टैग है। चलो इन्तेजार करके देखते है।
MvG

2
उथले विकल्प के हालिया जोड़ के साथ .gitmodules, क्या --depth 1विकल्प उन शाखाओं के लिए काम करता है जो मास्टर को बारीकी से ट्रैक नहीं कर रहे हैं?
CMCDragonkai

2
@CiroSantilli 刘晓波 死 ill 法轮功 and परिशुद्धता और परीक्षण के लिए धन्यवाद। मैंने आपकी टिप्पणी को अधिक दृश्यता के लिए उत्तर में शामिल किया है, और आपके उत्तर को उत्कीर्ण किया है।
वॉनक

2
यह उत्तर से स्पष्ट नहीं है कि इसे करने का वर्तमान तरीका क्या है। इसके अलावा, यह स्पष्ट नहीं है कि सभी की जरूरत है कि हर बार किसी को नई प्रति क्लोन करें या ये विरल सबमॉड्यूल सेटिंग्स रेपो का हिस्सा बनें जो इन सबमॉड्यूल्स का संदर्भ देता है (उदाहरण के लिए प्रत्येक नए क्लोन और सबमॉड्यूल अपडेट के परिणाम स्पॉन्सर सबमॉड्यूल चेकआउट में हैं)
पावेल पी

26

Git 2.9.0 समर्थन सबमॉडल्स उथले क्लोन सीधे, तो अब आप बस कॉल कर सकते हैं:

git clone url://to/source/repository --recursive --shallow-submodules

2
यह विकल्प सबसे आशाजनक है, लेकिन यह git 2.14.1 पर विफल रहता है। सबमॉड्यूल कमिट को किसी शाखा या टैग द्वारा ट्रैक नहीं किया जाता है: stackoverflow.com/a/47374702/895245
Ciro Santilli 郝海东 prom 事件 prom

1
@CiroSantilli 刘晓波 ill 事件 法轮功 g सुनिश्चित करें कि आपका git सर्वर भी अपडेट है
KindDragon

धन्यवाद, मैंने स्थानीय रूप से परीक्षण किया है, एक सर्वर के बिना, और GitHub पर, जिसे मैं अपडेट नहीं कर सकता :-)
Ciro Santilli 病,,,

1
मैं एक ही मुद्दा git 2 का उपयोग कर रहा हूँ .20, यह तब काम नहीं करता जब सबमॉड्यूल शाखा की नोक पर न हो।
ज़िट्रैक्स

16

रयान के जवाब के बाद मैं इस सरल स्क्रिप्ट के साथ आने में सक्षम था जो सभी सबमॉड्यूल्स और उथले क्लोनों के माध्यम से पुन: प्रसारित करता है:

#!/bin/bash
git submodule init
for i in $(git submodule | sed -e 's/.* //'); do
    spath=$(git config -f .gitmodules --get submodule.$i.path)
    surl=$(git config -f .gitmodules --get submodule.$i.url)
    git clone --depth 1 $surl $spath
done
git submodule update

मैं fatal: reference is not a tree: 88fb67b07621dfed054d8d75fd50672fb26349dfप्रत्येक
सबमॉड्यूल के


1
@knocte: मैंने अपना जवाब 2010 में लिखा था। चीजें बदल गई हैं। आप सभी को अपने सभी उत्तरों को बनाए रखने की उम्मीद नहीं कर सकते। मैंने वर्तमान मान्य उत्तर को मान लिया है।
मौरिसियो शेफ़र

13
@knocte यह एक कारण है कि मैंने स्टाकेवरफ्लो में योगदान देना बंद कर दिया। लोगों की ये अवास्तविक उम्मीदें हैं। मेरे 1637 उत्तरों में से हर एक को बनाए रखना एक पूर्णकालिक काम होगा। और फिर टिप्पणी भी कर रहे हैं, मुझे लगता है मैं उन लोगों को भी बनाए रखना होगा? तारीखों पर एक नज़र डालें, यही वे लिए हैं। यदि आप सूची के बजाय ArrayList का उपयोग करके कोड के साथ 2002 से कुछ .NET ब्लॉग पढ़ते हैं, तो क्या आप इसका उपयोग करेंगे? क्या आप मांग करेंगे कि लेखक ने अपनी पोस्ट को अपडेट किया? एक ही सिद्धांत यहाँ लागू होता है।
मौरिसियो शेफ़र

1
s / statusquo / प्रगति /
knocte

8

गिट-सबमॉडल "स्रोत" के माध्यम से पढ़ना, ऐसा लगता है git submodule addकि सबमॉड्यूल को संभाल सकता है जो पहले से ही उनके रिपॉजिटरी मौजूद हैं। उस स्तिथि में...

$ git clone $remote1 $repo
$ cd $repo
$ git clone --depth 5 $remotesub1 $sub1
$ git submodule add $remotesub1 $sub1
#repeat as necessary...

आप यह सुनिश्चित करना चाहते हैं कि आवश्यक कमोडिटी सबमॉडल रेपो में है, इसलिए सुनिश्चित करें कि आपने एक उपयुक्त सेट-डेप बनाया है।

संपादित करें: आप एक ही अद्यतन के बाद कई मैनुअल सबमॉड्यूल क्लोन के साथ दूर जाने में सक्षम हो सकते हैं:

$ git clone $remote1 $repo
$ cd $repo
$ git clone --depth 5 $remotesub1 $sub1
#repeat as necessary...
$ git submodule update

5
अब 1.8.0 git के लिए, आप रिपॉजिटरी के अंदर एक रिपॉजिटरी को क्लोन नहीं कर सकते। तो यह समाधान अब काम नहीं करता है।
बोह्र।

7

Git 2.14.1 के रूप में छोटी गाड़ी / अप्रत्याशित / कष्टप्रद व्यवहार का सारांश

  1. shallow = trueमें .gitmodulesकेवल प्रभावित git clone --recurse-submodulesकरता है, तो HEADआवश्यक करने के लिए दूरस्थ submodule अंक के लिए प्रतिबद्ध, लक्ष्य के लिए प्रतिबद्ध है, भले ही एक शाखा द्वारा की ओर इशारा किया है, और आप डाल भले ही branch = mybranchपर .gitmodulesसाथ ही साथ।

    स्थानीय परीक्षण स्क्रिप्ट । GitHub 2017-11 पर समान व्यवहार, जहां HEADडिफ़ॉल्ट शाखा रेपो सेटिंग द्वारा नियंत्रित किया जाता है:

    git clone --recurse-submodules https://github.com/cirosantilli/test-shallow-submodule-top-branch-shallow
    cd test-shallow-submodule-top-branch-shallow/mod
    git log
    # Multiple commits, not shallow.
    
  2. git clone --recurse-submodules --shallow-submodulesविफल रहता है अगर कमिट को न तो संदेश के साथ शाखा या टैग द्वारा संदर्भित किया जाता है error: Server does not allow request for unadvertised object:।

    स्थानीय परीक्षण स्क्रिप्ट । GitHub पर समान व्यवहार:

    git clone --recurse-submodules --shallow-submodules https://github.com/cirosantilli/test-shallow-submodule-top-sha
    # error
    

    मैंने मेलिंग सूची पर भी पूछा: https://marc.info/?l=git&m=151863590026582&w=2 और उत्तर था:

    सिद्धांत रूप में यह आसान होना चाहिए। :)

    व्यवहार में इतना नहीं, दुर्भाग्य से। ऐसा इसलिए है क्योंकि क्लोनिंग सिर्फ एक शाखा (आमतौर पर मास्टर) की नवीनतम टिप प्राप्त करेगी। सटीक sha1 जो वांछित है उसे निर्दिष्ट करने के लिए क्लोन में कोई तंत्र नहीं है।

    वायर प्रोटोकॉल सटीक sha1s पूछने के लिए समर्थन करता है, इसलिए इसे कवर किया जाना चाहिए। (कैविएट: यह केवल तभी काम करता है जब सर्वर ऑपरेटर uploadpack.allowReachableSHA1InWant को सक्षम करता है, जिसमें github AFAICT नहीं है)

    git-fetch मनमाने ढंग से sha1 लाने की अनुमति देता है, इसलिए वर्कअराउंड के रूप में आप "git submodule अद्यतन" का उपयोग करके पुनरावर्ती क्लोन के बाद एक भ्रूण चला सकते हैं क्योंकि प्रारंभिक क्लोन के बाद यह भ्रूण का उपयोग करेगा।

TODO परीक्षण: allowReachableSHA1InWant


ऐसा लगता है कि सबमॉडल के लिए अलग-अलग HEAD प्रतिबद्ध हैश की जांच करने का कोई सरल तरीका नहीं है, और डाउनस्ट्रीम उपयोगकर्ता हैं git clone --recursiveजो केवल उस विशिष्ट प्रतिबद्ध को प्राप्त करते हैं।
CMCDragonkai

3

क्या आपके सबमॉडल्स के लिए विहित स्थान दूरस्थ हैं? यदि हां, तो क्या आप उन्हें एक बार क्लोन करने के साथ ठीक हैं? दूसरे शब्दों में, क्या आप उथले क्लोनों को सिर्फ इसलिए चाहते हैं क्योंकि आप लगातार सबमोडुले (पुनः) क्लोनों के व्यर्थ बैंडविड्थ को भुगत रहे हैं?

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

यदि आप प्रत्येक सबमॉड्यूल का एक पूर्ण क्लोन करने के साथ ठीक हैं (साथ ही बाद में उन्हें अद्यतित रखने के लिए प्राप्त करते हैं), तो आप स्थानीय ऑब्जेक्ट स्टोर (जैसे कि Git 1.6.4 और बाद में) के --referenceविकल्प का उपयोग करने का प्रयास कर सकते हैं। विहित सबमॉड्यूल रिपॉजिटरी के क्लोन git submodule updateबनाते --mirrorहैं, फिर --referenceइन स्थानीय क्लोनों को इंगित करने के लिए अपने सबमॉड्यूल्स में उपयोग करें)। बस उपयोग करने से पहले git clone --reference/ git clone --sharedउसके बारे में पढ़ना सुनिश्चित करें --reference। मिररिंग मिरर के साथ एकमात्र संभावित समस्या यह होगी कि यदि वे कभी भी गैर-फास्ट-फॉरवर्ड अपडेट लाते हैं (हालांकि आप किसी भी छोड़े गए कमिट को बनाए रखने में मदद करने के लिए रिफ्लेक्स को सक्षम कर सकते हैं और अपनी समाप्ति खिड़कियों का विस्तार कर सकते हैं)। जब तक आपको कोई समस्या नहीं होनी चाहिए

  • आप कोई भी स्थानीय सबमॉडल कमिट नहीं करते हैं, या
  • गैर-फास्ट-फ़ॉर्वर्ड द्वारा झूलने वाले कोई भी कमिट जो कैनोनिकल रिपॉजिटरी प्रकाशित कर सकते हैं, वे आपके स्थानीय सबमॉडल कमिट्स के पूर्वज नहीं हैं, या
  • आप अपने स्थानीय सबमॉड्यूल को बनाए रखने के बारे में मेहनती हैं जो गैर-फास्ट-फॉरवर्ड के शीर्ष पर छूट दी जाती है जो कैनोनिकल सबमॉड्यूल रिपॉजिटरी में प्रकाशित हो सकती है।

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

और, जैसा कि git cloneमैनपेज कहता है, --referenceयदि आप इन निहितार्थों को नहीं समझते हैं तो उपयोग न करें ।

# Full clone (mirror), done once.
git clone --mirror $sub1_url $path_to_mirrors/$sub1_name.git
git clone --mirror $sub2_url $path_to_mirrors/$sub2_name.git

# Reference the full clones any time you initialize a submodule
git clone $super_url super
cd super
git submodule update --init --reference $path_to_mirrors/$sub1_name.git $sub1_path_in_super
git submodule update --init --reference $path_to_mirrors/$sub2_name.git $sub2_path_in_super

# To avoid extra packs in each of the superprojects' submodules,
#   update the mirror clones before any pull/merge in super-projects.
for p in $path_to_mirrors/*.git; do GIT_DIR="$p" git fetch; done

cd super
git pull             # merges in new versions of submodules
git submodule update # update sub refs, checkout new versions,
                     #   but no download since they reference the updated mirrors

वैकल्पिक रूप से, इसके बजाय --reference, आप git cloneअपने सबमॉडल्स के स्रोत के रूप में स्थानीय दर्पणों का उपयोग करके डिफ़ॉल्ट हार्डलिंकिंग कार्यक्षमता के साथ संयोजन में दर्पण क्लोन का उपयोग कर सकते हैं । नए सुपर-प्रोजेक्ट क्लोन में, स्थानीय दर्पण को इंगित करने के लिए git submodule init, सबमॉड्यूल URL को संपादित करें .git/config, फिर करेंgit submodule update। आपको हार्डलिंक प्राप्त करने के लिए किसी भी मौजूदा चेक-आउट सबमॉडल को फिर से प्राप्त करना होगा। आप केवल दर्पण में एक बार डाउनलोड करके बैंडविड्थ को बचाएंगे, फिर अपने चेक-आउट सबमोडुल्स में से स्थानीय रूप से प्राप्त करेंगे। हार्ड लिंकिंग डिस्क स्थान को बचाएगी (हालाँकि भ्रूण संचित सबमॉड्यूल्स ऑब्जेक्ट स्टोर्स के कई उदाहरणों में संचित और दोहराए जाएंगे; आप समय-समय पर दिए गए डिस्क स्पेस सेविंग को पुनः प्राप्त करने के लिए शीशों से चेक-आउट किए गए सबमोडुल्स को पुनः प्राप्त कर सकते हैं; hardlinking)।


2

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

#!/bin/bash
git submodule init
git submodule | while read hash name junk; do
    spath=$(git config -f .gitmodules --get submodule.$name.path)
    surl=$(git config -f .gitmodules --get submodule.$name.url)
    sbr=$(git ls-remote --tags $surl | sed -r "/${hash:1}/ s|^.*tags/([^^]+).*\$|\1|p;d")
    if [ -z $sbr ]; then
        git clone $surl $spath
    else
        git clone -b $sbr --depth 1 --single-branch $surl $spath
    fi
done
git submodule update 

2

के संदर्भ में विशिष्ट संशोधन / changeset साथ कैसे क्लोन करने के लिए Git भंडार?

मैंने एक साधारण स्क्रिप्ट लिखी है जिसमें कोई समस्या नहीं है जब आपका उप-विषयक संदर्भ मास्टर से दूर हो

git submodule foreach --recursive 'git rev-parse HEAD | xargs -I {} git fetch origin {} && git reset --hard FETCH_HEAD'

यह कथन सबमॉड्यूल के संदर्भित संस्करण को लाएगा।

यह तेज़ है, लेकिन आप सबमॉड्यूल पर अपना संपादन नहीं कर सकते (आपको https://stackoverflow.com/a/17937889/3156509 से पहले इसे प्राप्त करना होगा )

पूरे में:

#!/bin/bash
git submodule init
git submodule foreach --recursive 'git rev-parse HEAD | xargs -I {} git fetch origin {} && git reset --hard FETCH_HEAD'
git submodule update --recursive

1

एक सबमॉड्यूल का उथला क्लोन सही है क्योंकि वे एक विशेष संशोधन / बदलाव पर स्नैपशॉट देते हैं। वेबसाइट से ज़िप डाउनलोड करना आसान है इसलिए मैंने स्क्रिप्ट के लिए कोशिश की।

#!/bin/bash
git submodule deinit --all -f
for value in $(git submodule | perl -pe 's/.*(\w{40})\s([^\s]+).*/\1:\2/'); do
  mysha=${value%:*}
  mysub=${value#*:}
  myurl=$(grep -A2 -Pi "path = $mysub" .gitmodules | grep -Pio '(?<=url =).*/[^.]+')
  mydir=$(dirname $mysub)
  wget $myurl/archive/$mysha.zip
  unzip $mysha.zip -d $mydir
  test -d $mysub && rm -rf $mysub
  mv $mydir/*-$mysha $mysub
  rm $mysha.zip
done
git submodule init

git submodule deinit --all -f सबमॉड्यूल ट्री को साफ करता है जो स्क्रिप्ट को पुन: उपयोग करने की अनुमति देता है।

git submodule40 char sha1 को एक पथ के द्वारा पुनः प्राप्त करता है जो उसी के अनुरूप है .gitmodules। मैं पर्ल का उपयोग इस जानकारी, एक कॉलन सीमांकित श्रेणीबद्ध करने के लिए, तो चर परिवर्तन में मानों को अलग करने को रोजगार myshaऔर mysub

ये महत्वपूर्ण कुंजियाँ हैं क्योंकि हमें डाउनलोड करने के लिए sha1 की जरूरत है और url.gitmodules को सहसंबंधित करने के लिए पथ की आवश्यकता है।

एक विशिष्ट सबमॉड्यूल प्रविष्टि को देखते हुए:

[submodule "label"]
    path = localpath
    url = https://github.com/repository.git

myurlपर कुंजियों path =के बाद मूल्य प्राप्त करने के फिर 2 लाइनों लग रहा है। यह विधि लगातार काम नहीं कर सकती है और इसे परिष्कृत करने की आवश्यकता होती है। Url grep किसी भी शेष .gitप्रकार के संदर्भ को अंतिम /और कुछ तक मिलान करके स्ट्रिप्स बनाता है .

mydirहै mysubशून्य से एक अंतिम /nameनिर्देशिका submodule नाम करने के लिए अग्रणी द्वारा होता है।

अगला wgetडाउनलोड करने योग्य ज़िप संग्रह यूआरएल के प्रारूप के साथ है। यह भविष्य में बदल सकता है।

फ़ाइल को अनज़िप करें mydirजो सबमॉड्यूल पथ में निर्दिष्ट उपनिर्देशिका होगी। परिणामी फ़ोल्डर url- का अंतिम तत्व होगा sha1

यह देखने के लिए जांचें कि क्या सबमॉड्यूल पथ में निर्दिष्ट उपनिर्देशिका मौजूद है और निकाले गए फ़ोल्डर का नाम बदलने की अनुमति देने के लिए इसे हटा दें।

mv निकाले गए फ़ोल्डर का नाम बदलकर हमारे sha1 को उसके सही सबमॉड्यूल पथ पर रखें।

डाउनलोड की गई ज़िप फ़ाइल को हटाएं।

सबमॉड्यूल init

यह एक समाधान के बजाय अवधारणा का एक WIP प्रमाण अधिक है। जब यह काम करता है, तो परिणाम एक निर्दिष्ट बदलाव पर एक सबमॉड्यूल का एक उथला क्लोन है।

रिपॉजिटरी को एक अलग कमिटमेंट के लिए एक सबमॉड्यूल को फिर से होम करना चाहिए, अपडेट करने के लिए स्क्रिप्ट को फिर से चलाना चाहिए।

इस तरह की स्क्रिप्ट के लिए उपयोगी केवल एक स्रोत परियोजना के गैर-सहयोगी स्थानीय भवन के लिए है।

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