2011-01-06 12 views
108

वहाँ स्वचालित रूप से git submodule update (या अधिमानतः git submodule update --init जब भी git pull किया जाता है कहा जाता है?क्या गिट खींचने के लिए स्वचालित रूप से सबमिड्यूल अपडेट करने का कोई तरीका है?

एक Git config सेटिंग के लिए खोज रहे हैं, या एक Git उर्फ ​​इस के साथ मदद करने के लिए एक रास्ता है।

+3

संबंधित: http://stackoverflow.com/questions/1899792/why-is-git-submodule-update-not-automatic – philfreo

+0

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

+14

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

उत्तर

99

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

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

git config --global alias.pullall '!f(){ git pull "[email protected]" && git submodule update --init --recursive; }; f' 
+3

"git config --global" का उपयोग करना याद रखें यदि आप – yoyo

8

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

39

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

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

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

यह विकल्प या तो एक बूलियन मान या on-demand पर सेट किया जा सकता है।
इसे एक बूलियन में सेट करना fetch और pull के व्यवहार को बिना शर्त रूप से सबमिट करने के लिए सच्चाई में भर्ती करने के लिए या गलत पर सेट होने पर बिल्कुल रिकर्स नहीं करने के लिए बदलता है।

on-demand (डिफ़ॉल्ट मान), fetch और pullकरने के लिए सेट जब एक आबादी वाले submodule में केवल recurse होगा जब इसकी superproject को पुन: प्राप्त एक प्रतिबद्ध है कि submodule के संदर्भ अद्यतन करता है।

देखें:

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

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

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

+4

@ आर्टम सही है। यह उत्तर, हालांकि उपयोगी है, पूरे प्रश्न को संबोधित नहीं करता है। यह सेटिंग बस 'गिट fetch' निष्पादित करती है, न कि' गिट सबमिशन अपडेट '। –

+2

यह उत्तर अत्यधिक भ्रामक है। यहां तक ​​कि जब 'गिट पेंच' के बजाय 'गिट पुल' के साथ प्रयोग किया जाता है, तो यह विकल्प केवल * fetching * रिकर्सिव बनाता है। यह बदलेगा कि सबमिड्यूल में कौन सी प्रतिबद्धता की जांच की गई है। इसलिए @ गिट सबमिशन अपडेट' अभी भी आवश्यक है, जैसा कि @Artem द्वारा नोट किया गया है। –

3

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

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

गिट के लिए उपनाम के बजाय, आप उपनाम आदेश के माध्यम से गिट करने के लिए उपनाम जोड़ सकते हैं या गिट- (गिट-बेहतर मॉड्यूल) – idbrii

21

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

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

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

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

+0

से शुरू होने वाले अपने पथ में कमांड बनाकर जोड़ सकते हैं क्या यह वैश्विक सेटिंग बनाने का कोई तरीका है? या रिपोजिटरी की जांच करते समय आप स्वचालित रूप से प्राप्त होते हैं? –

+0

गिट, 2.9 की नवीनतम रिलीज ने [हुक निर्देशिका के लिए 'core.hooksPath' नामक एक सेटिंग जोड़ा है] (https://github.com/blog/2188-git-2-9-has-been-released# गिट-टिडबिट्स-गिटबिट्स-टिडगिट्स), अधिक जानकारी के लिए 'गिट-कॉन्फिग' के लिए दस्तावेज़ देखें। – taleinat

+0

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

संबंधित मुद्दे

 संबंधित मुद्दे