क्या जब भी किया जाता है स्वचालित रूप से git submodule update
(या अधिमानतः git submodule update --init
कहा जाता है) के लिए एक रास्ता git pull
है?
इसके लिए मदद करने के लिए git config सेटिंग, या git उपनाम खोज रहे हैं।
क्या जब भी किया जाता है स्वचालित रूप से git submodule update
(या अधिमानतः git submodule update --init
कहा जाता है) के लिए एक रास्ता git pull
है?
इसके लिए मदद करने के लिए git config सेटिंग, या git उपनाम खोज रहे हैं।
जवाबों:
2.14 Git के रूप में , आप उपयोग कर सकते हैं git pull --recurse-submodules
(और इसे आप जो चाहें पसंद कर सकते हैं)।
के रूप में Git 2.15 , आप सेट कर सकते हैं submodule.recurse
वांछित व्यवहार को सक्षम करने के सच करने के लिए।
आप इसे विश्व स्तर पर चलाकर कर सकते हैं:
git config --global submodule.recurse true
git pull
करने के लिए भी एक सबमॉड्यूल लाने और चलाने का कारण होगा submodule update
। यह वास्तव में अब स्वीकार किए जाते हैं जवाब की जरूरत है
git config --global submodule.recurse true
git clone
। और इसे डिफ़ॉल्ट रूप से बनाएं। अन्यथा, वहाँ हमेशा submodules उपयोग करने के लिए बहुत बड़ा प्रतिरोध होगा, लोगों के मॉड्यूल हमेशा सिंक के :-( बाहर निकलना के रूप में
commit
, fetch
, pull
, आदि) केवल वर्तमान भंडार को लागू किया जा करने के लिए डिजाइन किए हैं। एक सबमॉड्यूल एक और रिपॉजिटरी है और मूल रूप से पैरेंट-रिपॉजिटरी में निष्पादित कमांड से प्रभावित नहीं होना चाहिए। यह गिट-डेवलपर द्वारा डिजाइन-निर्णय का एक प्रकार है।
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'
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 config
मैन पेज (1.7.5) (या नवीनतम git config
मैन पेज )git fetch
मैन पेज (1.7.5) (या लेटेस्ट गिट मैन पेज )अधिक जानकारी के लिए।
git fetch --recurse-submodules[=yes|on-demand|no]
git fetch
नहीं, एक प्रदर्शन करती है git submodule update
।
git pull
, तब भी git fetch
, यह विकल्प केवल भ्रूण को पुनरावर्ती बनाता है । यह नहीं बदलेगा कि सबमॉडल्स में किस कमिटमेंट की जाँच की जाती है। तो git submodule update
अभी भी आवश्यक है, जैसा कि @Artem ने नोट किया है।
मुझे आश्चर्य है कि किसी ने भी ऐसा करने के लिए गिट हुक का उल्लेख नहीं किया है!
बस संबंधित रिपॉजिटरी की अपनी निर्देशिका में नाम post-checkout
और फाइलें जोड़ें , और उनमें से प्रत्येक में निम्नलिखित डालें:post-merge
.git/hooks
#!/bin/sh
git submodule update --init --recursive
चूँकि आप विशिष्ट रूप से एक उपनाम के लिए कहते हैं, यह मानते हुए कि आप कई रिपॉजिटरी के लिए यह चाहते हैं, तो आप एक ऐसा उपनाम बना सकते हैं जो इनको आपके लिए रिपॉजिटरी में जोड़ता है .git/hooks
।
core.hooksPath
, git-config
अधिक विवरण के लिए डॉक्स देखें।
git pull --rebase
:(
आप गिट कमांड के लिए एक उपनाम बना सकते हैं जो स्वचालित रूप से सबमॉड्यूल अपडेट को संभालता है। निम्नलिखित को अपने .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
}
जैसा कि दूसरों ने उल्लेख किया है, आप इसे आसानी से सेट कर सकते हैं:
git config --global submodule.recurse true
हालाँकि, यदि आप मेरे जैसे हैं और आपके पास एक अधिक जटिल .gitconfig
सेटअप है (मेरी मुख्य ~/.gitconfig
फाइल include
अन्य .gitconfig
फाइलों में लोड करने के लिए उपयोग की जाती है ), और आप कभी भी यह नहीं याद रख सकते हैं कि कमांड-लाइन git
कॉन्फिगर प्रारूप और प्रारूप के बीच कैसे परिवर्तित किया जाए .gitconfig
, यहां कैसे जोड़ा जाए आपकी किसी भी .gitconfig
फाइल में:
[submodule]
recurse = true
केवल तरीका है कि मैं कैसे अद्यतन करने के लिए सबमॉड्यूल और नेस्टेड सबमॉड्यूल प्राप्त करने में सक्षम था:
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;"
स्वचालित रूप से कमांड या उर्फ को चलाने के लिए कोई सुझाव?