गिट सबमॉडल के लिए नए कमिट्स पर ध्यान न दें


83

पृष्ठभूमि

लिनक्स पर Git 1.8.1.1 का उपयोग करना। रिपॉजिटरी इस प्रकार दिखता है:

master
  book

निम्न प्रकार बनाया गया था:

$ cd /path/to/master
$ git submodule add https://user@bitbucket.org/user/repo.git book

bookSubmodule साफ है:

$ cd /path/to/master/book/
$ git status
# On branch master
nothing to commit, working directory clean

मुसीबत

दूसरी ओर, मास्टर दिखाता है कि पुस्तक के लिए "नए तरीके" हैं:

$ cd /path/to/master/
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   book (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")

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

$ cd /path/to/master/
$ git status
# On branch master
nothing to commit, working directory clean

विफल # 1 - गंदा

फ़ाइल के अंदर master/.gitmodulesइस उत्तर के अनुसार निम्नलिखित है :

[submodule "book"]
        path = book
        url = https://user@bitbucket.org/user/repo.git
        ignore = dirty

विफल # 2 विफल - विफल

master/.gitmodulesइस उत्तर के अनुसार निम्नलिखित में परिवर्तन किया गया है :

[submodule "book"]
        path = book
        url = https://user@bitbucket.org/user/repo.git
        ignore = untracked

असफल # 3 - showUntrackedFiles

master/.git/configइस उत्तर के अनुसार निम्नलिखित को संपादित किया गया :

[status]
   showUntrackedFiles = no

असफल # 4 - नजरअंदाज

मास्टर अनदेखा फ़ाइल में पुस्तक निर्देशिका जोड़ी:

$ cd /path/to/master/
$ echo book > .gitignore

विफल # 5 - क्लोन

पुस्तक निर्देशिका को गुरु के साथ इस प्रकार जोड़ा गया:

$ cd /path/to/master/
$ rm -rf book
$ git clone https://user@bitbucket.org/user/repo.git book

सवाल

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

#
#       modified:   book (new commits)
#

git statusमास्टर रिपॉजिटरी में निष्पादित करते समय उस संदेश को कैसे दबाएं?

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


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

@FelixKling, अगर आप इस तरह के रिपोज जोड़ते हैं और इसे GitHub पर धकेल देते हैं, तो क्या यह उस फ़ोल्डर की सामग्री की नकल के बिना इसके लिए सिर्फ लिंक बनाएगा?
रोमन बेकेविएव

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

2
मुझे लगता है कि आप "उपेक्षा = सभी" की तलाश कर रहे हैं
greuze

1
Git 2.13 (Q2 2017) के साथ, आप विचार कर सकेंगे git config submodule.<name>.active false। देखें नीचे मेरा उत्तर
VonC

जवाबों:


60

एक और रिपॉजिटरी को शामिल करने के लिए, जिसे इसके सुपर-रेपो में ट्रैक करने की आवश्यकता नहीं है, इसे आज़माएं:

$ cd /path/to/master/
$ rm -rf book
$ git clone https://user@bitbucket.org/user/repo.git book
$ git add book
$ echo "book" >> .gitignore

फिर कमिट करें।

जैसा कि लिंक किए गए गिट सबमॉड्यूल नुकसान के लेख में कहा गया है :

... माता-पिता और सबमॉड्यूल के बीच एकमात्र जुड़ाव यह है कि सबमॉड्यूल के चेक-आउट SHA का रिकॉर्ड किया गया मूल्य जो माता-पिता के आवागमन में संग्रहीत होता है।

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

जब आप सबमॉड्यूले में एक अलग कमिटमेंट की जांच करते हैं या उसमें एक नया कमिटमेंट करते हैं, तो सुपर-रेपो देखेंगे कि उसका चेक आउट एसएचए बदल गया है। तभी आपको modified (new commits)लाइन मिलती है git status

इसे खत्म करने के लिए, आप या तो:

  • git submodule update, जो सुपर-रेपो (विवरण देखने के लिए) में वर्तमान में सहेजे गए कमिट के लिए सबमॉड्यूल को रीसेट करेगा लिए git submoduleमैनबोर्ड और या देखें
  • git add book && git commit सुपर रेपो में नए SHA को बचाने के लिए।

जैसा कि टिप्पणियों में उल्लेख किया गया है, bookसबमॉड्यूल को छोड़ने पर विचार करें : इसे सुपर-रेपो के अंदर क्लोन करें, यदि सुपर-रेपो के हिस्से के रूप में इसके राज्य का ट्रैकिंग आवश्यक नहीं है।


3
वाह, अब मैं समझता हूं, सुपरमॉडल को सबमॉड्यूल के संस्करण को जानने की आवश्यकता क्यों है। बेशक, यह करने के लिए समझ में आता है git add book && git commit। मुझे महसूस नहीं हुआ कि git वास्तव में यह सुनिश्चित कर सकता है कि दो रिपोज सिंक में हैं।
सर्गेई ओरशान्स्की

103

बस दौडो:

$ git submodule update

यह सबमॉडल के नवीनतम संस्करण के साथ अभिभावक-रेपो को अद्यतन किए बिना, सबमॉड्यूल को पुरानी प्रतिबद्ध (पैरेंट-रेपो में निर्दिष्ट) को वापस कर देगा।


6
नहीं, यह स्थिति नहीं बदलेगी।
एड बिशप

ओपी वास्तव में रिपॉजिटरी से नवीनतम क्यों नहीं होना चाहेगा book? मुझे नहीं लगता कि आपका जवाब इस संदर्भ में कोई मायने रखता है।
एलेक्सिस विल्के

@AlexisWilke और यदि पुस्तक इंटरफ़ेस नाटकीय रूप से बदलता है और ओपी के पास मास्टर रेपो में बदलाव करने का समय नहीं है?
लॉगमैन

यह वह उत्तर है जिसकी मुझे तलाश थी!
LLSv2.0

21

दो प्रकार के परिवर्तन नोटिस हैं जिन्हें आप दबा सकते हैं (git 1.7.2 से)।

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

modified: book (untracked content)

आप इन्हें दबा सकते हैं:

[submodule "book"]
    path = modules/media
    url = https://user@bitbucket.org/user/repo.git
    ignore = dirty

हालाँकि, एक बार जब आप उन परिवर्तनों को कर लेते हैं, तो माता-पिता भंडार एक बार फिर से नोटिस लेंगे और तदनुसार रिपोर्ट करेंगे:

modified:   book (new commits)

यदि आप इन्हें भी दबाना चाहते हैं, तो आपको सभी परिवर्तनों को अनदेखा करने की आवश्यकता है

[submodule "book"]
    path = book
    url = https://user@bitbucket.org/user/repo.git
    ignore = all

कल्पना कीजिए कि मैंने ignore = allसभी सबमॉड्यूल में विकल्प जोड़ा है । आखिरकार कुछ मॉड्यूल्स में नए कमिट होते हैं जिन्हें धक्का दिया गया। यदि कोई व्यक्ति सुपर-रेपो क्लोन करता है, तो क्या यह सबमॉड्यूल्स की पुरानी स्थिति पर होगा या यह नवीनतम लोगों की जांच करेगा?
फेलिकज़

कमांड के साथ git clone --recursive git@...आपको सबमॉडल्स की पुरानी स्थिति मिलेगी। उन्हें अपडेट करने के लिए, आपको git submodule foreach "git pull"क्लोनिंग के बाद कुछ इस तरह की आवश्यकता होगी
greuze

1
दुर्भाग्य से, ignore = allविकल्प सबमॉड्यूल के नए कमिट्स को अनदेखा नहीं करता है। मैं git संस्करण 1.7.1 चला रहा हूं। कोई विचार तरीका?
रोमुलस

10

Git 2.13 (Q2 2017) एक सबमॉड्यूल को शामिल करने के लिए एक और तरीका जोड़ देगा, जिसे इसके मूल रेपो द्वारा ट्रैक करने की आवश्यकता नहीं है।

ओपी के मामले में:

git config submodule.<name>.active false

देखें प्रतिबद्ध 1b614c0 , 1f8d711 प्रतिबद्ध , bb62e0a प्रतिबद्ध , 3e7eaed प्रतिबद्ध , a086f92 प्रतिबद्ध (17 मार्च 2017), और ee92ab9 प्रतिबद्ध , 25b31f1 प्रतिबद्ध , e7849a9 प्रतिबद्ध , 6dc9f01 प्रतिबद्ध , 5c2bd8b प्रतिबद्ध (16 मार्च 2017) द्वारा ब्रैंडन विलियम्स ( mbrandonw)
( जूनियो सी gitsterहमानो द्वारा विलय - - in a93dcb0 , 30 मार्च 2017)

submodule: डीआरओल यूआरएल और सबमॉड्यूल ब्याज

वर्तमान में submodule.<name>.url विन्यास विकल्प का उपयोग यह निर्धारित करने के लिए किया जाता है कि क्या दिया गया उप-उपयोगकर्ता उपयोगकर्ता के लिए रुचि रखता है। यह एक ऐसी दुनिया में बोझिल हो रहा है, जहाँ हम चाहते हैं कि अलग-अलग वर्कटॉम्स में अलग-अलग सबमॉड्यूल्स की जाँच की जाए या जो सबमॉड्यूल्स रुचि के हों उनका चयन करने के लिए अधिक सामान्यीकृत तंत्र।

सबमोड्यूल्स के लिए वर्कट्री सपोर्ट के साथ भविष्य में, कई कार्यशील पेड़ होंगे, जिनमें से प्रत्येक को केवल चेक किए गए सबमॉडल्स के सबसेट की आवश्यकता हो सकती है।
URL (जो सबमॉड्यूल रिपॉजिटरी प्राप्त किया जा सकता है) अलग-अलग कार्यशील पेड़ों के बीच भिन्न नहीं होना चाहिए।

यह उपयोगकर्ताओं के लिए सुविधाजनक हो सकता है कि वे अधिक आसानी से उन सबमॉड्यूल्स के समूहों को निर्दिष्ट कर सकें, git submodule init <path>जिन्हें वे अपने काम के पेड़ में जांचना चाहते हैं।

यह अंत करने के लिए दो विन्यास विकल्प पेश किए गए हैं, submodule.activeऔर submodule.<name>.active

  • submodule.activeConfig एक pathspec कि निर्दिष्ट करता है जो submodules काम कर पेड़ में मौजूद होना चाहिए आयोजित करता है।
    • submodule.<name>.activeConfig एक बूलियन यदि उस विशेष submodule काम कर पेड़ में मौजूद होना चाहिए इंगित करने के लिए प्रयोग किया जाता है झंडा है।

यह ध्यान रखना महत्वपूर्ण है कि submodule.activeयह अन्य कॉन्फ़िगरेशन विकल्पों की तुलना में अलग तरीके से कार्य करता है क्योंकि यह एक pathspec लेता है।
यह उपयोगकर्ताओं को कम से कम दो नए वर्कफ़्लो अपनाने की अनुमति देता है:

  1. सबमोड्यूल्स को एक प्रमुख निर्देशिका के साथ वर्गीकृत किया जा सकता है, जैसे कि एक pathspec उदा ' lib/' सभी लाइब्रेरी-ईश मॉड्यूल को कवर करेगा, जो उन लोगों को अनुमति देने के लिए है जो लाइब्रेरी-ईश मॉड्यूल में रुचि रखते हैं " submodule.active = lib/" बस एक बार किसी भी और सभी मॉड्यूल को कहने के लिए "lib/ ' के लिए। दिलचस्प।
  2. एक बार जब pathspec- विशेषता सुविधा का आविष्कार किया जाता है, तो उपयोगकर्ता सबमॉड्यूल को लेबल कर सकते हैं ताकि उन्हें समूहित किया जा सके, ताकि विशेषताओं की आवश्यकताओं के साथ एक व्यापक pathspec, जैसे ' :(attr:lib)', का उपयोग किसी भी और सभी मॉड्यूल को कहने के लिए किया जा सके lib
    चूंकि .gitattributesफ़ाइल, फ़ाइल की तरह .gitmodules, सुपरप्रोजेक्ट द्वारा ट्रैक की जाती है, जब सुपरप्रोजेक्ट ट्री में एक सबमॉड्यूल चलता है, तो परियोजना इस बात को समायोजित कर सकती है कि किस पथ को विशेषता मिलती है .gitattributes, जैसे यह समायोजित कर सकता है कि किस पथ में सबमॉड्यूल है .gitmodules

<name>किसी मौजूदा परियोजना में उप-मॉड्यूल के लिए सटीक कैसे पता करें ?
सुविचार 4242

@ ideasman42 .gitmodules में कॉन्फिग पढ़ने में मदद करनी चाहिए: stackoverflow.com/a/12641787/6309
VonC

आह यह .git/config[submodule "<name>"]
ideasman42

1
मेरे लिए काम नहीं। यहाँ मैं क्या कर रहा हूँ: 1) के साथ git क्लोन --recursive; 2) सेट git config जवाब के रूप में; 3) git चेकआउट, git पुल टू चेकआउट लास्ट सबमॉड्यूल; फिर भी "(नए कमिट)" मिलते हैं।
वू बैक्वान

2
@VonC आपको मैसेज करने से पहले, मैंने दोनों मामलों (मौजूदा रेपो के साथ-साथ नए इनिशियलाइज्ड रेपो के साथ) की कोशिश की, दोनों मामलों में काम नहीं किया।
साही

3

Nevik Rehnel उत्तर निश्चित रूप से आप जो पूछ रहे हैं उसके लिए सही एक है: मैं एक सबमॉड्यूल नहीं करना चाहता था, कैसे बिल्ली मैं उस स्थिति से बाहर निकलता हूं ?!

केवल, यदि आपकी masterपरियोजना को bookसबमॉड्यूल की आवश्यकता है , तो इसे इस तरह रखना एक अच्छा संकेत है क्योंकि इस तरह से अन्य उपयोगकर्ता जो आपकी परियोजना की जांच करते हैं, फिर gitचलाने के लिए कोई विशेष कमांड नहीं होने का आनंद ले सकते हैं (अच्छी तरह से ... कुछ विशेष कमांड का उपयोग करने के लिए हैं सबमॉड्यूल्स, लेकिन यह अभी भी प्रबंधित करने के लिए सरल है, कुल मिलाकर, मुझे लगता है।)

आपके मामले में आप bookरिपॉजिटरी में परिवर्तन करते हैं और कुछ बिंदु पर आप उन परिवर्तनों को करते हैं। इसका मतलब है कि आपके पास उस सबमॉड्यूल में नए कमिट हैं , जिनमें एक नया SHA1 संदर्भ है।

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

cd /path/to/master
git commit . -m "Update 'book' in master"

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

इसलिए जब भी आप एक सबमॉडल में बदलाव करते हैं तो आप एक और कमिटमेंट के साथ समाप्त हो जाते हैं। यह अर्ध-पारदर्शी है यदि आप masterरिपॉजिटरी में कुछ फाइलों में बदलाव करते हैं, क्योंकि आप दोनों एक ही समय में करते हैं।


-5

Daud

git submodule update 

जड़ स्तर पर।


बस किसी को भी आश्चर्य हो रहा है। मेरे मामले में (और ओपी?), यह क्या git statusकहता है बदल नहीं है । यह अभी भी लगता है कि परिवर्तन हुआ है।
स्क्वैरिज्म

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