क्या स्वचालित रूप से सबमॉड्यूल अपडेट करने के लिए गिट पुल बनाने का कोई तरीका है?


203

क्या जब भी किया जाता है स्वचालित रूप से git submodule update(या अधिमानतः git submodule update --initकहा जाता है) के लिए एक रास्ता git pullहै?

इसके लिए मदद करने के लिए git config सेटिंग, या git उपनाम खोज रहे हैं।



1
क्यों एक शैल उपनाम के लिए एक बेहतर उपनाम है?
wnoise

20
git उपनाम अच्छा है क्योंकि यह "git" नामस्थान में कमांड को इनकैप्सुलेट करता है। आप यह भी पूछ सकते हैं कि सभी git कमांड अपने नाम रखने के बजाय "git" से क्यों शुरू होते हैं।
लिली बॉलार्ड

5
इसे खोजने वाले किसी भी व्यक्ति के लिए, उच्च मतदान वाले उत्तर वर्तमान में पुराने हैं। केन का उत्तर सटीक है: stackoverflow.com/a/49427199/3499424
जॉन नेहॉस

जवाबों:


176

2.14 Git के रूप में , आप उपयोग कर सकते हैं git pull --recurse-submodules(और इसे आप जो चाहें पसंद कर सकते हैं)।

के रूप में Git 2.15 , आप सेट कर सकते हैं submodule.recurseवांछित व्यवहार को सक्षम करने के सच करने के लिए।

आप इसे विश्व स्तर पर चलाकर कर सकते हैं:

git config --global submodule.recurse true

3
2.16 के साथ पुष्टि की है, यह सच git pullकरने के लिए भी एक सबमॉड्यूल लाने और चलाने का कारण होगा submodule update। यह वास्तव में अब स्वीकार किए जाते हैं जवाब की जरूरत है
जॉन Neuhaus

1
इसे विश्व स्तर पर स्थापित करने के लिए:git config --global submodule.recurse true
सर्दियाँ

14
मैं सबमॉडल्स से निराश था, फिर मैंने ऐसा किया। अब वे ऐसे काम करते हैं जैसे मैं उम्मीद करता हूं। क्या कोई कारण है जो मैं नहीं सोच रहा हूँ कि यह डिफ़ॉल्ट व्यवहार नहीं है?
बेन

9
उन्हें इसके लिए सक्षम होना चाहिए git clone। और इसे डिफ़ॉल्ट रूप से बनाएं। अन्यथा, वहाँ हमेशा submodules उपयोग करने के लिए बहुत बड़ा प्रतिरोध होगा, लोगों के मॉड्यूल हमेशा सिंक के :-( बाहर निकलना के रूप में
सिरो Santilli郝海东冠状病六四事件法轮功

1
@CiroSantilli新疆改造中心法轮功六四事件Santilli Git आदेश (जैसे commit, fetch, pull, आदि) केवल वर्तमान भंडार को लागू किया जा करने के लिए डिजाइन किए हैं। एक सबमॉड्यूल एक और रिपॉजिटरी है और मूल रूप से पैरेंट-रिपॉजिटरी में निष्पादित कमांड से प्रभावित नहीं होना चाहिए। यह गिट-डेवलपर द्वारा डिजाइन-निर्णय का एक प्रकार है।
आयनों

113

git config --global alias.pullall '!git pull && git submodule update --init --recursive'

यदि आप चाहते हैं कि तर्क को खींचने के लिए पारित किया जाए, तो इसके बजाय इसका उपयोग करें:

git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'

4
"git config --global" का उपयोग करना याद रखें यदि आप अपने उपयोग के सभी git repos में यह उर्फ ​​चाहते हैं
yoyo

43

Git 1.7.5 के साथ शुरू करके इसे डिफ़ॉल्ट रूप से स्वचालित रूप से अपडेट करना चाहिए जैसे आप चाहते हैं।

[संपादित करें: टिप्पणी प्रति: नई 1.7.5 व्यवहार स्वचालित रूप से करने के लिए है लाने submodules के लिए नवीनतम करता है, लेकिन नहीं करने के लिए अद्यतन उन्हें (में git submodule updateभावना)। तो इस उत्तर में जानकारी पृष्ठभूमि के रूप में प्रासंगिक है, लेकिन अपने आप में एक पूर्ण उत्तर नहीं है। आपको अभी भी एक कमांड में सबमॉडल्स को खींचने और अपडेट करने के लिए एक उपनाम की आवश्यकता है।]

डिफ़ॉल्ट व्यवहार, "ऑन-डिमांड", जब भी आप एक ऐसी प्रतिबद्धता लाते हैं, जो सबमॉड्यूल कमिट को अपडेट करती है, तो सबमॉडल्स को अपडेट करना है और यह कमिट पहले से ही आपके स्थानीय क्लोन में स्थित नहीं है।
आप इसे हर भ्रूण या कभी नहीं (पूर्व 1.7.5 व्यवहार जो मुझे लगता है) पर अपडेट किया जा सकता है।
इस व्यवहार को बदलने के लिए कॉन्फ़िगरेशन विकल्प है fetch.recurseSubmodules

यह विकल्प या तो बूलियन मान पर सेट किया जा सकता है या करने के लिए on-demand
इसे एक बूलियन में सेट करने से व्यवहार में परिवर्तन होता है fetchऔर pullजब यह सही साबित होता है या झूठे के लिए सेट नहीं किया जाता है तो बिना सबमॉड्यूल के पुनरावर्तन के लिए।

जब on-demand(डिफ़ॉल्ट मान) पर सेट किया जाता है , fetchऔर pull केवल एक पॉपुलेटेड सबमॉड्यूल में पुनरावृत्ति करेगा जब इसका सुपरप्रोजेक्ट एक कमिट को पुनः प्राप्त करता है जो सबमॉड्यूल के संदर्भ को अपडेट करता है

देख:

अधिक जानकारी के लिए।

git fetch --recurse-submodules[=yes|on-demand|no]

27
बाहर देखें: जैसा कि नीचे दिए गए उत्तर हैं, यह केवल परिवर्तनों को स्वचालित रूप से प्राप्त करता है, फिर भी आपको एक सबमॉड्यूल अपडेट करना होगा - इसलिए अन्य उत्तर सही है।
आर्टेम

4
@ आर्टेम सही है। यह उत्तर, हालांकि उपयोगी है, पूरे प्रश्न को संबोधित नहीं करता है। यह सेटिंग केवल एक git fetchनहीं, एक प्रदर्शन करती है git submodule update
एंड्रयू फेरियर

2
यह उत्तर अत्यधिक भ्रामक है। यहां तक ​​कि जब इसके साथ प्रयोग किया जाता है git pull, तब भी git fetch, यह विकल्प केवल भ्रूण को पुनरावर्ती बनाता है । यह नहीं बदलेगा कि सबमॉडल्स में किस कमिटमेंट की जाँच की जाती है। तो git submodule updateअभी भी आवश्यक है, जैसा कि @Artem ने नोट किया है।
मार्क अमेरी

31

मुझे आश्चर्य है कि किसी ने भी ऐसा करने के लिए गिट हुक का उल्लेख नहीं किया है!

बस संबंधित रिपॉजिटरी की अपनी निर्देशिका में नाम post-checkoutऔर फाइलें जोड़ें , और उनमें से प्रत्येक में निम्नलिखित डालें:post-merge.git/hooks

#!/bin/sh
git submodule update --init --recursive

चूँकि आप विशिष्ट रूप से एक उपनाम के लिए कहते हैं, यह मानते हुए कि आप कई रिपॉजिटरी के लिए यह चाहते हैं, तो आप एक ऐसा उपनाम बना सकते हैं जो इनको आपके लिए रिपॉजिटरी में जोड़ता है .git/hooks


2
क्या इसे वैश्विक सेटिंग बनाने का कोई तरीका है? या जब आप रिपॉजिटरी की जाँच करते हैं तो आप अपने आप मिल जाते हैं?
राउल स्टेफेन

3
Git, 2.9 की नवीनतम रिलीज़ ने हुक निर्देशिका के लिए एक सेटिंग जोड़ी हैcore.hooksPath , git-configअधिक विवरण के लिए डॉक्स देखें।
कथा

1
जब जाँच के दौरान कुछ स्वतः प्राप्त होता है, तो मैंने खोजा, लेकिन कुछ भी नहीं मिला। एक सूत्र ने उल्लेख किया है कि यह जानबूझकर सुरक्षा के मुद्दों के लिए समर्थित नहीं है, क्योंकि यह आसानी से ग्राहक मशीनों पर मनमाना कोड चलाने के लिए इस्तेमाल किया जा सकता है।
कथावाचक

1
मैं देखता हूं कि यह सुरक्षा का मुद्दा कैसे हो सकता है। आखिरकार, मैं अपने सहकर्मियों के कंप्यूटर पर उन्हें निर्देश दिए बिना कोड I कार्यक्रम चलाने के लिए इसका उपयोग करना चाहता हूं।
राउल स्टेफेन

1
यह समाधान मेरा पहला विचार था, लेकिन तब मुझे एहसास हुआ कि यह उन लोगों को कवर नहीं करेगा जो इस्तेमाल करते हैं git pull --rebase:(
Vaz

8

केविन बैलार्ड द्वारा सुझाया गया एक उपनाम, पूरी तरह से एक अच्छा समाधान है। बस वहाँ एक और विकल्प टॉस करने के लिए, आप पोस्ट-मर्ज हुक का उपयोग भी कर सकते हैं जो बस चलता है git submodule update [--init]


7

आप गिट कमांड के लिए एक उपनाम बना सकते हैं जो स्वचालित रूप से सबमॉड्यूल अपडेट को संभालता है। निम्नलिखित को अपने .bashrc में जोड़ें

# make git submodules usable
#   This overwrites the 'git' command with modifications where necessary, and
#   calls the original otherwise
git() {
    if [[ $@ == clone* ]]; then
        gitargs=$(echo "$@" | cut -c6-)
        command git clone --recursive $gitargs
    elif [[ $@ == pull* ]]; then
        command git "$@" && git submodule update --init --recursive
    elif [[ $@ == checkout* ]]; then
        command git "$@" && git submodule update --init --recursive
    else
        command git "$@"
    fi
}

1
Git के लिए एक उपनाम के बजाय, आप उपनाम के माध्यम से या अपने मार्ग में कमांड बनाकर उपनाम जोड़ सकते हैं जो git- (git-bettermodule)
idbrii

7

जैसा कि दूसरों ने उल्लेख किया है, आप इसे आसानी से सेट कर सकते हैं:

git config --global submodule.recurse true

हालाँकि, यदि आप मेरे जैसे हैं और आपके पास एक अधिक जटिल .gitconfigसेटअप है (मेरी मुख्य ~/.gitconfigफाइल includeअन्य .gitconfigफाइलों में लोड करने के लिए उपयोग की जाती है ), और आप कभी भी यह नहीं याद रख सकते हैं कि कमांड-लाइन gitकॉन्फिगर प्रारूप और प्रारूप के बीच कैसे परिवर्तित किया जाए .gitconfig, यहां कैसे जोड़ा जाए आपकी किसी भी .gitconfigफाइल में:

[submodule]
  recurse = true

0

केवल तरीका है कि मैं कैसे अद्यतन करने के लिए सबमॉड्यूल और नेस्टेड सबमॉड्यूल प्राप्त करने में सक्षम था:

git submodule update --remote --merge --recursive; git submodule foreach --recursive "(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);" git add .; git commit -m 'SubmodulesSynced'; git push; git pull;

मैं कोष्ठक के कारण टर्मिनल के माध्यम से उपनाम बनाने के लिए संघर्ष कर रहा था इसलिए मुझे इसे वैश्विक रूप से .gitconfig में मैन्युअल रूप से जोड़ना पड़ा:

[alias] supdate = "!git submodule update --remote --merge --recursive; git submodule foreach --recursive '(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);' git add .; git commit -m 'SubmodulesSynced'; git push; git pull;"

स्वचालित रूप से कमांड या उर्फ ​​को चलाने के लिए कोई सुझाव?

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