Git सबमॉड्यूल जोड़ते समय मैं एक शाखा / टैग कैसे निर्दिष्ट कर सकता हूं?


755

कैसे git submodule add -bकाम करता है ?

एक विशिष्ट शाखा के साथ एक सबमॉड्यूल जोड़ने के बाद, एक नया क्लोन रिपॉजिटरी (बाद में git submodule update --init) एक विशिष्ट प्रतिबद्ध पर होगा, न कि शाखा खुद ( git statusसबमॉड्यूल पर "किसी भी शाखा में वर्तमान में नहीं दिखाता है")।

मैं पर कोई जानकारी नहीं मिल सकता है .gitmodulesया .git/config, submodule की शाखा या किसी विशिष्ट प्रतिबद्ध के बारे में इतना कैसे करता Git यह आंकड़ा बाहर?

इसके अलावा, क्या एक शाखा के बजाय एक टैग निर्दिष्ट करना संभव है?

मैं संस्करण 1.6.5.2 का उपयोग कर रहा हूं।


3
यदि आपके पास एक मौजूदा सबमॉड्यूल है जो अभी तक एक शाखा पर नज़र नहीं रख रहा है , लेकिन आप चाहते हैं कि यह अब एक शाखा को ट्रैक करे ... नीचे मेरा जवाब देखें
VonC

जवाबों:


745

नोट: Git 1.8.2 ने शाखाओं को ट्रैक करने की संभावना को जोड़ा। नीचे दिए गए कुछ उत्तर देखें।


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

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

यह एक सबमॉड्यूल के लिए बहुत अच्छा है जो अक्सर नहीं बदलता है, क्योंकि तब प्रोजेक्ट पर हर कोई एक ही प्रतिबद्ध पर सबमॉड्यूल कर सकता है।

यदि आप किसी विशेष टैग में सबमॉड्यूल को स्थानांतरित करना चाहते हैं:

cd submodule_directory
git checkout v1.0
cd ..
git add submodule_directory
git commit -m "moved submodule to v1.0"
git push

फिर, एक और डेवलपर जो सबमॉडुले_निर्देशित करना चाहता है, उस टैग में बदल जाता है, यह करता है

git pull
git submodule update --init

git pullवे परिवर्तन जो उनकी उप-निर्देशिका निर्देशिका को इंगित करते हैं। git submodule updateवास्तव में नए कोड में विलय हो जाता है।


8
यह एक बहुत अच्छी व्याख्या है, धन्यवाद! और हां, आपके जवाब को पढ़ने के बाद, मुझे एहसास हुआ कि कमिटमेंट सबमॉड्यूल (सबमॉड्यूल / .it / HEAD) के अंदर ही बचा है।
इवान

4
यह 1.7.4.4 git पर काम नहीं करता है। cd my_submodule; git checkout [ref in submodule's repositoryपैदावार fatal: reference is not a tree: ...। यह ऐसा है जैसे कि gitकेवल माता-पिता के भंडार पर काम करेंगे।
जेम्स ए। रोसेन

3
अक्सर अद्यतन की जाने वाली परियोजनाओं के लिए भी गिट सबमॉडल्स का उपयोग करना अच्छा होता है। लिनक्स कर्नेल इसका उपयोग करता है और यह इतना बुरा नहीं है

10
है git checkout v1.0एक शाखा या एक टैग?
बर्नहार्ड डब्लर

8
एक टैग एक मानव पठनीय उपनाम के लिए एक प्रतिबद्ध पर विचार करें। और एक कमेटी प्रत्येक फाइल के लिए विशिष्ट स्थिति का एक सेट है। एक शाखा अनिवार्य रूप से एक ही चीज है सिवाय इसके कि आप इसमें बदलाव कर सकते हैं।
deadbabykitten

656

मैं यहां एक उत्तर जोड़ना चाहूंगा जो वास्तव में अन्य उत्तरों का एक समूह है, लेकिन मुझे लगता है कि यह अधिक पूर्ण हो सकता है।

आपको पता है कि आपके पास ये दो चीजें होने पर एक Git सबमॉड्यूल है।

  1. आपकी .gitmodulesप्रविष्टि में ऐसा है:

    [submodule "SubmoduleTestRepo"]
        path = SubmoduleTestRepo
        url = https://github.com/jzaccone/SubmoduleTestRepo.git
    
  2. आपकी Git रिपॉजिटरी में आपके पास एक सबमॉड्यूल ऑब्जेक्ट (SubmoduleTestRepo नाम इस उदाहरण में) है। GitHub इन्हें "सबमॉड्यूल" ऑब्जेक्ट के रूप में दिखाता है। या git submodule statusएक कमांड लाइन से करते हैं। Git सबमॉड्यूल ऑब्जेक्ट्स Git ऑब्जेक्ट्स के विशेष प्रकार होते हैं, और वे SHA सूचना को एक विशिष्ट कमिट के लिए होल्ड करते हैं।

    जब भी आप ऐसा करते हैं git submodule update, तो यह आपके सबमॉड्यूल को कमिटमेंट की सामग्री से आबाद करेगा। यह जानता है कि जानकारी के कारण कमिटमेंट कहां मिलेगा .gitmodules

    अब, -bआपकी .gitmodulesफ़ाइल में सभी पंक्ति एक पंक्ति जोड़ रही है । तो एक ही उदाहरण के बाद, यह इस तरह दिखेगा:

    [submodule "SubmoduleTestRepo"]
        path = SubmoduleTestRepo
        url = https://github.com/jzaccone/SubmoduleTestRepo.git
        branch = master
    

    नोट: केवल शाखा नाम एक .gitmodulesफ़ाइल में समर्थित है , लेकिन SHA और TAG समर्थित नहीं हैं! (इसके बजाय, प्रत्येक मॉड्यूल की शाखा की प्रतिबद्धता को ट्रैक किया जा सकता है और " git add ." का उपयोग करके अपडेट किया जा सकता है , उदाहरण के लिए git add ./SubmoduleTestRepo, और आपको .gitmodulesहर बार फ़ाइल बदलने की आवश्यकता नहीं है )

    उप-विषय वस्तु अभी भी एक विशिष्ट प्रतिबद्धता की ओर इशारा करती है। केवल एक चीज जो -bविकल्प खरीदती है, वह है --remoteवोगेला के उत्तर के अनुसार आपके अपडेट में एक ध्वज जोड़ने की क्षमता :

    git submodule update --remote
    

    सबमॉडल की सामग्री को सबमॉड्यूल द्वारा बताए गए कमिट पर पॉप्युलेट करने के बजाय, यह प्रतिस्थापित करता है कि मास्टर ब्रांच पर नवीनतम कमिट के साथ कमिट करता है, तो यह उस कमिटम के साथ सबमॉडल को पॉप्युलेट करता है। यह djacobs7 उत्तर द्वारा दो चरणों में किया जा सकता है। चूँकि आपने अब अद्यतन किया है कमिटमॉडल ऑब्जेक्ट इंगित कर रहा है, तो आपको अपने Git रिपॉजिटरी में परिवर्तित सबमॉड्यूल ऑब्जेक्ट को कमिट करना होगा।

    git submodule add -bशाखा के साथ सब कुछ रखने के लिए कुछ जादुई तरीका नहीं है। यह बस .gitmodulesफ़ाइल में एक शाखा के बारे में जानकारी जोड़ता है और आपको पॉप्युलेट करने से पहले एक निर्दिष्ट शाखा के नवीनतम कमिट में सबमॉड्यूल ऑब्जेक्ट को अपडेट करने का विकल्प देता है।


14
इस उत्तर में अधिक वोट होने चाहिए। मैं पिछले दिन के लिए कई पोस्ट पढ़ रहा हूं और इससे सारी उलझनें दूर हो जाती हैं। एसवीएन दुनिया से आ रहा है और बाह्य उपकरणों का उपयोग कर रहा है - कोई यह मानना ​​चाहता है कि गिट सबमॉड्यूल शाखा ट्रैकिंग जादुई रूप से शाखा से सब कुछ रखती है - लेकिन यह सच नहीं है! आपको उन्हें स्पष्ट रूप से अपडेट करना होगा! जैसा कि आप उल्लेख करते हैं, आपको परिवर्तित सबमॉड्यूल ऑब्जेक्ट्स करना होगा।
dtmland

12
क्या यह शाखा ट्रैकिंग टैग के साथ भी काम करती है ? एक शाखा के बजाय मैंने अपने में एक टैग निर्दिष्ट किया .gitmodulesऔर करने के बाद $ git submodule update --init --remote TestModuleमुझे एक त्रुटि मिली fatal: Needed a single revisionऔर कहा Unable to find current origin/TestTag revision in submodule path 'TestModule'। एक वास्तविक शाखा के साथ करते समय यह काम करता है। क्या वास्तव .gitmodulesमें सटीक वचन निर्दिष्ट किए बिना टैग निर्दिष्ट करने के लिए कोई रास्ता है?
हट सेप

5
यह काम नहीं लगता है। मैंने हैश को अपडेट किया .gitmodulesऔर चलाया git submodule updateऔर कुछ नहीं हुआ?
CMCDragonkai

2
किसी तरह यह मेरे लिए काम नहीं करता है। SHA कमिट आईडी के साथ, मुझे हमेशा एक त्रुटि मिलती है "वर्तमान संशोधन खोजने में असमर्थ (I ने HEAD की संशोधन संख्या और उसके सही की जाँच की)। हालांकि अगर मैं मास्टर का उपयोग करता हूं तो यह काम करता है।
infoclogged

2
शाखा विशेषता में एक SHA दर्ज करना मेरे लिए भी काम नहीं करता है। यह उपयोग डॉक्स द्वारा भी समर्थित नहीं है : git-scm.com/docs/gitmodules
Jakub Bochenski

338

(Git 2.22, Q2 2019, पेश किया गया है git submodule set-branch --branch aBranch -- <submodule_path>)

ध्यान दें कि आप एक है, तो मौजूदा जो submodule नहीं है अभी तक एक शाखा पर नज़र रखने के लिए, तो ( यदि आप Git 1.8.2+ है ):

  • सुनिश्चित करें कि जनक रेपो जानता है कि उसका सबमॉडल अब एक शाखा को ट्रैक करता है:

    cd /path/to/your/parent/repo
    git config -f .gitmodules submodule.<path>.branch <branch>
    
  • सुनिश्चित करें कि आपका सबमॉड्यूल वास्तव में उस शाखा के नवीनतम स्थान पर है:

    cd path/to/your/submodule
    git checkout -b branch --track origin/branch
      # if the master branch already exist:
      git branch -u origin/master master
    

         ( 'मूल' के नाम होने के साथ रेपो नदी के ऊपर रिमोट submodule से। क्लोन किया गया है
         एक git remote -vके अंदर है कि submodule यह प्रदर्शित करेगा। आमतौर पर, यह है 'मूल')

  • अपने माता-पिता रेपो में अपने सबमॉडल की नई स्थिति को रिकॉर्ड करना न भूलें:

    cd /path/to/your/parent/repo
    git add path/to/your/submodule
    git commit -m "Make submodule tracking a branch"
    
  • उस सबमॉडल के बाद के अपडेट के लिए --remoteविकल्प का उपयोग करना होगा :

    # update your submodule
    # --remote will also fetch and ensure that
    # the latest commit from the branch is used
    git submodule update --remote
    
    # to avoid fetching use
    git submodule update --remote --no-fetch 
    

ध्यान दें कि Git 2.10+ (Q3 2016) के साथ, आप .शाखा नाम के रूप में ' ' का उपयोग कर सकते हैं :

शाखा के नाम के रूप में दर्ज की गई है submodule.<name>.branchमें .gitmodulesके लिए update --remote
एक विशेष मूल्य का .उपयोग यह इंगित करने के लिए किया जाता है कि सबमॉड्यूल में शाखा का नाम वर्तमान रिपॉजिटरी में वर्तमान शाखा के समान नाम होना चाहिए

लेकिन, जैसा कि लुबोस ने टिप्पणी की है

साथ git checkout, अगर पालन करने के लिए शाखा का नाम "है .", यह आपके अप्रतिबद्ध काम मार देंगे! इसके बजाय
उपयोग करें git switch

इसका मतलब है Git 2.23 (अगस्त 2019) या अधिक।

देखें " द्वारा भ्रमितgit checkout "


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

    git submodule update --recursive --remote

ध्यान दें कि प्रत्येक अपडेट किए गए सबमॉड्यूल के लिए परिणाम, लगभग हमेशा एक अलग HEAD होगा , जैसा कि उनके जवाब में डैन कैमरन ने लिखा है ।

( क्लिंट टिप्पणी में टिप्पणी करते हैं कि, यदि आप चलाते हैं git submodule update --remoteऔर परिणामी sha1 शाखा के रूप में एक ही है, तो उपमोडल वर्तमान में है, यह कुछ भी नहीं करेगा और सबमॉडल को अभी भी "उस शाखा पर" नहीं छोड़ेगा और अलग राज्य में अलग नहीं होगा। )

यह सुनिश्चित करने के लिए कि वास्तव में शाखा की जाँच की गई है (और यह अभिभावक रेपो के लिए सबमॉडल का प्रतिनिधित्व करने वाली विशेष प्रविष्टि के SHA1 को संशोधित नहीं करेगा ), वे सुझाव देते हैं:

git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git switch $branch'

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

अलेक्जेंडर पोगरेबनीक द्वारा टिप्पणियों में$toplevel अनुशंसित, के उपयोग पर ध्यान दें । मई 2010 में git1.7.2 में पेश किया गया था: f030c96
$toplevel

इसमें शीर्ष स्तरीय निर्देशिका (जहां .gitmodulesहै) का निरपेक्ष पथ समाहित है।

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

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

 git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git switch $branch' –

एक ही कमांड लेकिन पढ़ने में आसान:

git submodule foreach -q --recursive \
    'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
     [ "$branch" = "" ] && \
     git checkout master || git switch $branch' –

umläute ने dtmland की कमांड को टिप्पणियों में सरलीकृत संस्करण के साथ परिष्कृत किया :

git submodule foreach -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'

कई लाइनें:

git submodule foreach -q --recursive \
  'git switch \
  $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'

Git 2.26 (Q1 2020) से पहले, एक भ्रूण जिसे submodules में पुनरावर्ती रूप से अपडेट करने के लिए कहा जाता है, अनिवार्य रूप से आउटपुट का उत्पादन करता है, और त्रुटि संदेशों को स्पॉट करना कठिन हो जाता है।

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

एमिली शफ़र ( ) द्वारा देखें 0222540 (16 जनवरी 2020 )(द्वारा विलय Junio सी Hamano - - में b5c71cc प्रतिबद्ध , 05 फरवरी 2020)nasamuffin
gitster

fetch: सबमॉड्यूल लाने के दौरान विफलता पर जोर दें

साइन-ऑफ-बाय: एमिली शफ़र

ऐसे मामलों में जब कई सबमोड्यूल्स होने पर एक सबमॉड्यूल लाने में असफलता होती है, एक से अधिक भ्रूण वापस आने पर अन्य सबमोड्यूल्स पर गतिविधि के तहत लोन फेलिंग सबमॉड्यूल लाने में त्रुटि होती है fetch-by-oid
एक विफलता को देर से कॉल करें ताकि उपयोगकर्ता को पता चले कि कुछ गलत हो गया है, और कहां

क्योंकि fetch_finish()केवल run_processes_parallel,म्यूटिंग द्वारा सिंक्रोनस कहा जाता है चारों ओर की आवश्यकता नहीं है submodules_with_errors


1
प्रश्न: अगर मेरे पास फ़ोल्डर सबमॉड्यूल 1 है और मास्टर शाखा को ट्रैक करना चाहते हैं, तो परिणामी कमांड इस तरह दिखेगी
BraveNMMath

1
foreachस्क्रिप्ट hardcoded पर निर्भर नहीं होगा <path>, यदि आप स्थानापन्न <path>के साथ $toplevel/
अलेक्जेंडर पोगरेबनीक

1
foreachस्क्रिप्ट चेकआउट submodules कि एक शाखा का पालन नहीं कर रहे हैं करने के लिए असफल हो जायेगी। हालाँकि, यह कमांड आपको दोनों देता है:git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git checkout $branch'
dtmland

2
यहाँ @ dtmland की स्क्रिप्ट का सरलीकृत संस्करण है:git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
umläute

1
ओह! दरअसल फॉर्च्यू लिपि अनावश्यक है। हमें सबमॉड्यूल अपडेट को --merge या --rebase स्विच: git submodule update --remote --mergeया के साथ निष्पादित करना होगा git submodule update --remote --rebase। ये कमांड रिमोट ब्रांच की ट्रैकिंग करते हैं।
ग्रेगटॉम

206

Git 1.8.2 ने शाखाओं को ट्रैक करने की संभावना को जोड़ा।

# add submodule to track master branch
git submodule add -b branch_name URL_to_Git_repo optional_directory_rename

# update your submodule
git submodule update --remote 

गिट सबमॉडल्स भी देखें


4
क्या यह टैग पर भी लागू होता है?
थोरसुमोनर

1
इस तरह से सबमॉड्यूल जोड़ना .gitmodulesफ़ाइल पर कैसे प्रतिबिंबित होता है?
यूजीन

1
धन्यवाद मैं सिर्फ मदद करने के बारे में जानकारी का इस्तेमाल किया मुझे उस एक GitHub gh-पृष्ठों वेबसाइट के साथ समन्वयित है एक submodule फ़ोल्डर बनाने के लिए: पर पूर्ण उदाहरण github.com/o2platform/fluentnode/issues/22
Dinis क्रूज़

4
आप एक टैग पर लॉक git submodule add -b tags/<sometag> <url>कर सकते हैं जिसके साथ आप लाइन branch = tags/<sometag>में देख सकते हैं.gitmodules
KCD

9
@KCD git का कौन सा संस्करण टैग के साथ कर सकता है। मेरा काम नहीं करता है?
CMCDragonkai

58

मैं Git सबमॉड्यूल का उपयोग कैसे करता हूं, इसका एक उदाहरण।

  1. एक नया भंडार बनाएँ
  2. फिर एक और रिपॉजिटरी को एक सबमॉड्यूल के रूप में क्लोन करें
  3. तब हमारे पास उस सबमॉडल में V3.1.2 नामक एक टैग का उपयोग होता है
  4. और फिर हम प्रतिबद्ध हैं।

और यह थोड़ा सा दिखता है:

git init 
vi README
git add README
git commit 
git submodule add git://github.com/XXXXX/xxx.yyyy.git stm32_std_lib
git status

git submodule init
git submodule update

cd stm32_std_lib/
git reset --hard V3.1.2 
cd ..
git commit -a

git submodule status 

शायद यह मदद करता है (भले ही मैं एक टैग का उपयोग करता हूं और एक शाखा नहीं)?


4
यह मूल रूप से djacobs7 के रूप में एक ही जवाब है, लेकिन वैसे भी धन्यवाद :)
इवान

1
क्या आपको अपने बाद बदलाव करने में सक्षम होना चाहिए git reset --hard V3.1.2? मुझे बस एक "कुछ नहीं करने के लिए" git statusमाता-पिता की निर्देशिका के साथ मिलता है।
निक रैडफोर्ड

1
@ इवान: क्या आप बता सकते हैं कि यह कैसे djacobs7 की प्रतिक्रिया के समान है? जहां तक ​​मैं देखता हूं, उसकी प्रतिक्रिया में 'सबमॉड्यूल ऐड' कमांड भी शामिल नहीं है, इसके बजाय मॉड्यूल के मूल गिट रेपो के लिंक के बिना रेपो को सीधे जोड़ा जाता है। कम से कम जब मैंने इस दृष्टिकोण की कोशिश की तो .gitmodules में कोई लिंक नहीं था।
मिशेल मुलर

djacobs7 की प्रतिक्रिया में सबमॉड्यूल जोड़ने से शुरू होने वाला संपूर्ण विवरण शामिल नहीं है। वह मानता है कि आपके पास पहले से ही है।
कोडमोंकी

क्या यह पूरे सबमॉड्यूल की सामग्री को ट्रैक किए गए ऑब्जेक्ट के रूप में आपके मुख्य रेपो में नहीं जोड़ता है?
user1312695

38

मेरे अनुभव में सुपरप्रोजेक्ट या भविष्य के चेकआउट में शाखाओं को स्विच करने के बाद भी सबमॉड्यूल्स के अलग-अलग HEAD हो जाएंगे, भले ही सबमॉडल को सही तरीके से जोड़ा और ट्रैक किया जाए (यानी @ djacobs7 और @Johnny Z उत्तर)।

और इसके बजाय मैन्युअल रूप से सही शाखा की मैन्युअल रूप से जांच करने या स्क्रिप्ट के माध्यम से एक git submodule foreach का उपयोग किया जा सकता है।

यह शाखा संपत्ति के लिए सबमॉड्यूल कॉन्फिग फ़ाइल की जाँच करेगा और सेट शाखा की जाँच करेगा।

git submodule foreach -q --recursive 'branch="$(git config -f <path>.gitmodules submodule.$name.branch)"; git checkout $branch'


अच्छा लगा। +1। मैंने आपके उत्तर को अपने उत्तर में शामिल किया है ।
VonC

33

गिट सबमॉडल्स थोड़ा अजीब हैं - वे हमेशा "अलग सिर" मोड में होते हैं - वे शाखा पर नवीनतम प्रतिबद्ध के लिए अपडेट नहीं करते हैं जैसे आप उम्मीद कर सकते हैं।

जब आप इसके बारे में सोचते हैं तो यह कुछ समझ में आता है। मान लीजिए कि मैं सबमॉड्यूल बार के साथ रिपॉजिटरी फू बनाता हूं । मैं अपने बदलावों को आगे बढ़ाता हूं और आपको बताता हूं कि रिपॉजिटरी फू से a7402be कमिट करें ।

फिर कल्पना करें कि आपके क्लोन बनाने से पहले कोई व्यक्ति रिपॉजिटरी बार में बदलाव करता है ।

जब आप बाहर की जाँच करें a7402be रिपॉजिटरी फू से , तो आप उसी कोड को पाने की उम्मीद करते हैं जिसे मैंने पुश किया था। यही कारण है कि जब तक आप उन्हें स्पष्ट रूप से नहीं बताते हैं और फिर एक नई प्रतिबद्धता बनाते हैं, तब तक सबमॉड्यूल्स अपडेट नहीं होते हैं।

व्यक्तिगत रूप से मुझे लगता है कि सबमॉड्यूल गिट का सबसे भ्रमित करने वाला हिस्सा हैं। बहुत सी जगहें हैं जो सबमॉड्यूल्स को मुझसे बेहतर बता सकती हैं। मैं स्कॉट Chacon द्वारा प्रो गिट सलाह देते हैं ।


मुझे लगता है कि यह समय है कि मैं कुछ गिट किताबें पढ़ना शुरू कर दूं, सिफारिश के लिए धन्यवाद।
इवान

क्षमा करें, लेकिन आपने यह स्पष्ट नहीं किया है कि यदि आप को a7402be पर धकेल दिया जाता है, या आपके नवीनतम संस्करण के रूप में बार मिलेगा, तो वही मिलेगा। धन्यवाद :)
mmm

6
मुद्दा यह है कि "ब्रांच एक्स पर यह सबमॉडल रखें" कहने का विकल्प होना चाहिए ताकि यदि आप इसे स्वचालित रूप से अपडेट करना चाहते हैं तो आप ऐसा कर सकते हैं। यह सबमॉड्यूल्स को प्रबंधित करने के लिए बहुत अधिक उपयोगी बना देगा जैसे कि एक वर्डप्रेस इंस्टॉलेशन जहां प्लगइन्स सभी Git repos हैं जो अपडेट किए गए प्रत्येक प्लगइन के लिए सुपरप्रोजेक्ट को फिर से सहेजे बिना हैं।
jerclarke

@jeremyclark git clone git://github.com/git/git.gitऔर धक्का है कि सुविधा ...? = डी
एलास्टेयर

1
गिट के बारे में सबसे भ्रामक हिस्सा यह है कि विकास के एक दशक से अधिक समय के बाद भी एक उपकरण जो मुझे मेरी नौकरी पाने में मदद करने के लिए है, अभी भी इस तरह का एक बुरा उपयोगकर्ता अनुभव है और पूरी तरह से मेरे से परे लोगों द्वारा जीआईटी द्वारा उंगली दिखाए जाने का आनंद लेने के लिए है। समय।
0xC0000022L

20

एक सबमॉड्यूल के लिए शाखा स्विच करने के लिए (यह मानकर कि आपके पास पहले से ही भंडार के हिस्से के रूप में सबमॉड्यूल है):

  • cd सबमॉडल्स युक्त आपके भंडार की जड़ में
  • .gitmodulesसंपादन के लिए खोलें
  • नीचे पंक्ति जोड़ें path = ...और url = ...कहा कि branch = your-branch, प्रत्येक सबमॉड्यूल के लिए; फ़ाइल सहेजें .gitmodules
  • तब निर्देशिका बदले बिना $ git submodule update --remote

... यह निर्दिष्ट शाखा पर नवीनतम कमिट में खींचना चाहिए, इस प्रकार संशोधित प्रत्येक सबमॉड्यूल के लिए।


10

मैं अपने .gitconfig फ़ाइल में यह है। यह अभी भी एक मसौदा है, लेकिन अब तक उपयोगी साबित हुआ है। यह मुझे हमेशा अपनी शाखा को सबमॉड्यूल्स को फिर से लिखने में मदद करता है।

[alias]

######################
#
#Submodules aliases
#
######################


#git sm-trackbranch : places all submodules on their respective branch specified in .gitmodules
#This works if submodules are configured to track a branch, i.e if .gitmodules looks like :
#[submodule "my-submodule"]
#   path = my-submodule
#   url = git@wherever.you.like/my-submodule.git
#   branch = my-branch
sm-trackbranch = "! git submodule foreach -q --recursive 'branch=\"$(git config -f $toplevel/.gitmodules submodule.$name.branch)\"; git checkout $branch'"

#sm-pullrebase :
# - pull --rebase on the master repo
# - sm-trackbranch on every submodule
# - pull --rebase on each submodule
#
# Important note :
#- have a clean master repo and subrepos before doing this !
#- this is *not* equivalent to getting the last committed 
#  master repo + its submodules: if some submodules are tracking branches 
#  that have evolved since the last commit in the master repo,
#  they will be using those more recent commits !
#
#  (Note : On the contrary, git submodule update will stick 
#to the last committed SHA1 in the master repo)
#
sm-pullrebase = "! git pull --rebase; git submodule update; git sm-trackbranch ; git submodule foreach 'git pull --rebase' "

# git sm-diff will diff the master repo *and* its submodules
sm-diff = "! git diff && git submodule foreach 'git diff' "

#git sm-push will ask to push also submodules
sm-push = push --recurse-submodules=on-demand

#git alias : list all aliases
#useful in order to learn git syntax
alias = "!git config -l | grep alias | cut -c 7-"

3

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

इसलिए हमने इसे इस तरह से हासिल किया:

कॉन्फ़िगरेशन बनाएँ

name: Project Name

modules:
  local/path:
    repository: https://github.com/<username>/<repo>.git
    path: repo/path
    branch: dev
  other/local/path/filename.txt:
    repository: https://github.com/<username>/<repo>.git
    hexsha: 9e3e9642cfea36f4ae216d27df100134920143b9
    path: repo/path/filename.txt

profiles:
  init:
    tasks: ['modules']

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

अन्य डेवलपर्स को बस चलाने की आवश्यकता है

$ quack

और यह उपरोक्त विन्यास से कोड खींचता है।


2

सबमॉड्यूल के लिए एक शाखा चुनने का एकमात्र प्रभाव यह है कि जब भी आप कमांड लाइन --remoteमें विकल्प पास करते हैं git submodule update, तो Git अलग किए गए HEAD मोड (यदि डिफ़ॉल्ट --checkoutव्यवहार का चयन किया जाता है) में उस चयनित दूरस्थ शाखा की नवीनतम प्रतिबद्धता होगी ।

यदि आप सबमोडुल्स के उथले क्लोन के साथ काम करते हैं तो गिट सबमोडुल्स के लिए इस दूरस्थ शाखा ट्रैकिंग सुविधा का उपयोग करते समय आपको विशेष रूप से सावधान रहना चाहिए। शाखा आप submodule सेटिंग में इस उद्देश्य के लिए चयन नहीं है कि एक के दौरान क्लोन हो जाएगा git submodule update --remote। यदि आप भी --depthपैरामीटर पास करते हैं और आप गिट को निर्देश नहीं देते हैं कि आप किस शाखा में क्लोन करना चाहते हैं - और वास्तव में आपgit submodule update कमांड लाइन में नहीं जा सकते हैं !! -, यह स्पष्ट रूप से git-clone(1)दस्तावेज में समझाया गया है कि git clone --single-branchजब स्पष्ट --branchपैरामीटर गायब है, और इसलिए यह प्राथमिक शाखा को क्लोन करेगा

कोई आश्चर्य की बात नहीं है, git submodule updateकमांड द्वारा किए गए क्लोन चरण के बाद , यह अंत में सबमॉड्यूल के लिए आपके द्वारा पहले स्थापित की गई दूरस्थ शाखा के लिए नवीनतम प्रतिबद्ध की जांच करने की कोशिश करेगा , और अगर यह प्राथमिक नहीं है, तो इसका हिस्सा नहीं है आपका स्थानीय उथला क्लोन, और इसलिए यह विफल हो जाएगा

घातक: एक ही संशोधन की आवश्यकता है

वर्तमान मूल / NotThePrimaryBranch संशोधन को सबमॉड्यूल पथ 'mySubmule' में खोजने में असमर्थ


त्रुटि को ठीक करने के लिए कैसे - एक संशोधन की आवश्यकता है?
निधिनस्पद्रदीप

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