सवाल गिट नए submodules init / सिंक / अद्यतन नहीं करेगा


यहां मेरी सामग्री का हिस्सा है .gitmodules फ़ाइल:

[submodule "src/static_management"]
        path = src/static_management
        url = git://github.com/eykd/django-static-management.git
[submodule "external/pyfacebook"]
        path = external/pyfacebook
        url = http://github.com/sciyoshi/pyfacebook.git

तथापि, .git/config केवल पहला शामिल है:

[submodule "src/static_management"]
        url = git://github.com/eykd/django-static-management.git

दूसरा सबमिशन (external/pyfacebook) एक फीचर शाखा में एक और डेवलपर द्वारा जोड़ा गया था। मैंने अब विकास को विरासत में मिला है, और फीचर शाखा की जांच की है। हालांकि, गिट मेरे लिए सबमिशन नहीं खींच पाएगा। मैंने कोशिश की:

  • git submodule init
  • git submodule update
  • git submodule update --init
  • git submodule sync
  • से सभी सबमिशन परिभाषाओं को हटा रहा है .git/config और चल रहा है git submodule init। यह केवल पहले के मौजूदा सबमिशन पर प्रतिलिपि बनाता है और नए को अनदेखा करता है।
  • में नई सबमिशन परिभाषाएं दर्ज करना .git/config मैन्युअल रूप से और चल रहा है git submodule update। केवल पहले मौजूदा submodules अद्यतन करने के लिए परेशान हैं।

विभिन्न संयोजनों में, लेकिन गिट बस अपडेट नहीं होगा .git/config की नई सामग्री के आधार पर .gitmodules, न ही यह बना देगा external/pyfacebook फ़ोल्डर और सबमिशन की सामग्री खींचें।

मैं क्या खो रहा हूँ? मैन्युअल हस्तक्षेप है (हाथ से एक सबमिशन प्रविष्टि जोड़ना .git/config) वास्तव में आवश्यक है, और क्यों?

संपादित करें: मैन्युअल हस्तक्षेप काम नहीं करता है। मैन्युअल रूप से नई सबमिशन प्रविष्टि को जोड़ना .git/config कोई काम नहीं करता नया सबमिशन अनदेखा किया जाता है।


76
2017-07-26 16:47


मूल


1.7.7.1 चल रहा है और एक ही समस्या है: "गिट सबमिशन सिंक" .gitmodules में परिवर्तन के बाद .git / config अद्यतन नहीं करता है। - James Pritts
यह आलेख सहायक है: chrisjean.com/git-submodules-adding-using-removing-and-updating - Igor Ganapolsky


जवाब:


क्या आपने हाल ही में गिट संस्करण 1.7.0.4 में अपग्रेड किया था? मैंने किया और अब इसी तरह के मुद्दे हैं ...

संपादित करें: मैंने अपनी समस्या तय की है लेकिन समस्या यह नहीं है कि बिल्कुल भी कोई जानकारी नहीं है। मैंने मैन्युअल रूप से दोनों .git / config और .gitmodules से सबमिशन प्रविष्टियों को हटा दिया और उपयोग किए गए चरणों (गिट सबमिशन एड आदि ...) के साथ मेरे सबोड्यूल्यूल को फिर से जोड़ा ... वर्क्सफार्म लेकिन इस धागे को कोई मूल्य नहीं जोड़ता है।


28
2017-08-26 16:10



मैं अभी 1.7.2 तक हूं, लेकिन मेरा मानना ​​है कि मुझे कम से कम 1.6.x से समस्या हो रही है। - David Eyk
और हाँ, इसके बारे में सोचने के लिए आओ, जैसा कि आप वर्णन करते हैं, मैं ऐसा करने के लिए समाप्त हुआ (मैं भूल गया कि यह प्रश्न अभी भी खुला था!)। यदि आपको थोड़ा सा जवाब देने में कोई फर्क नहीं पड़ता है, तो मैं इसे स्वीकार करूंगा। - David Eyk
यह गिट की एक सतत कमजोरी है। बाहरीों के साथ भी एसवीएन बेहतर है। - Peter DeWeese
मुझे लगता है कि मैं बस इसमें भी भाग गया, (उसी चरण में अंततः इसे ठीक करने लगते हैं)। एकमात्र चीज मैंने देखा, इसे फिर से जोड़ने के बाद, प्रतिबद्धता ने कहा: प्रतिबद्ध मोड 160000 lib / jruby-swing-helpers (हुह?) - rogerdpack
"गेट मोड 160000" के बारे में प्रो गिट बुक कहता है: "रैक एंट्री के लिए 160000 मोड पर ध्यान दें। यह गिट में एक विशेष मोड है जिसका मूल रूप से मतलब है कि आप एक उपनिर्देशिका के बजाय निर्देशिका प्रविष्टि के रूप में एक प्रतिबद्धता रिकॉर्ड कर रहे हैं या फ़ाइल। " git-scm.com/book/en/Git-Tools-Submodules - Johann


मुझे यह वही समस्या थी - यह पता चला कि .gitmodules फ़ाइल प्रतिबद्ध थी, लेकिन वास्तविक सबमिशन प्रतिबद्धता (यानी सबमिशन की प्रतिबद्ध आईडी का रिकॉर्ड) नहीं था।

इसे मैन्युअल रूप से जोड़ना चाल करना प्रतीत होता है - उदा .:

git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook

(यहां तक ​​कि .git / config या .gitmodules से कुछ भी हटाए बिना।)

फिर आईडी को सही तरीके से रिकॉर्ड करने के लिए प्रतिबद्ध करें।

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

 git config --list

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

 mv yourmodulename yourmodulename-temp
 git submodule update --init

यह पता लगाने के लिए कि क्या आपके पास सबमिशन में स्थानीय परिवर्तन हैं, इसे गिट स्थिति -u (यदि आप सबमिशन में परिवर्तन देखना चाहते हैं) या गिट स्थिति --ignore-submodules (यदि आप में परिवर्तन नहीं देखना चाहते हैं) के माध्यम से देखा जा सकता है सबमिशन)।


64
2018-01-28 23:58



क्या है external/pyfacebook के लिये? - Igor Ganapolsky
@IgorGanapolsky यह आपके सबमिशन के लिए गंतव्य पथ है। - yuhua
इससे मेरी मदद की, बहुत बहुत धन्यवाद! मैं बस इतना जोड़ सकता हूं कि यदि गंतव्य पथ पहले से मौजूद है (जो उसने अन्य आदेशों को आजमाने के परिणामस्वरूप किया है) तो निम्न संदेश प्राप्त होता है जो केवल भ्रम में जोड़ता है: 'your/local/path' already exists and is not a valid git repo - Michael Ambrus
"git config --list" में प्रविष्टियों को पढ़ने के लिए एक लाइनर: git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash - Puggan Se


गिट संस्करण 2.7.4। यह आदेश स्थानीय कोड अद्यतन करता है git submodule update --init --force --remote


36
2017-11-21 11:15



मेरे लिए कुछ नहीं कर रहा हूँ। - Carlo Wood
गिट-सबमिशन [दस्तावेज़ीकरण) के संबंध में (git-scm.com/docs/git-submodule#git-submodule---remote) उपरोक्त आदेश को submodules की स्थानीय शाखा अद्यतन करना चाहिए। - palik


जब एक ही मुद्दा था, तो गिट ने अनदेखा किया था init तथा update आदेश, और कुछ भी नहीं करता है।

कैसे ठीक करना है

  1. आपका सबमिशन फ़ोल्डर गिट रेपो में किया जाना चाहिए
  2. यह .gitignore में नहीं होना चाहिए

अगर वह आवश्यकताओं को पूरा किया जाता है, तो यह काम करेगा। अन्यथा, सभी आदेश किसी भी संदेश और परिणाम के बिना निष्पादित होंगे।

यदि आपने यह सब किया है, और यह अभी भी काम नहीं करता है:

  1. मैन्युअल रूप से सबमिशन जोड़ें, उदा। git submodule add git@... path/to
  2. git submodule init
  3. git submodule update
  4. प्रतिबद्ध करें और सभी फाइलों को धक्का दें - .gitmodules और आपका मॉड्यूल फ़ोल्डर (नोट, फ़ोल्डर की सामग्री प्रतिबद्ध नहीं होगी)
  5. अपने स्थानीय गिट रेपो ड्रॉप करें
  6. एक नया क्लोन करें
  7. सुनिश्चित करें कि .git/config अभी तक कोई सबमिशन नहीं है
  8. अभी व, git submodule init - और आप एक संदेश देखेंगे कि मॉड्यूल पंजीकृत है
  9. git submodule update मॉड्यूल लाएगा
  10. अब देखो .git/config और आपको पंजीकृत सबमिशन मिलेगा

14
2017-10-27 13:45



गिट सबमिशन गिट @ जोड़ें ... पथ / करने के लिए - मेरे लिए चाल है - Amit Yatagiri


जादुई रूप से क्रमबद्ध करें, लेकिन आज मैं भाग गया git submodule init के बाद    git submodule sync के बाद git submodule update और यह शुरू हुआ   मेरे submodules खींच रहा है ... जादू? शायद! यह वास्तव में सबसे अधिक में से एक है   गिट के साथ कष्टप्रद अनुभव ...

उसको खरोंचो। मैं वास्तव में यह कर कर काम कर रहा है git submodule update --init --recursive। उम्मीद है की यह मदद करेगा।

पीएस: सुनिश्चित करें कि आप रूट गिट निर्देशिका में हैं, न कि सबमिशन के।


3
2018-05-19 01:10



नहीं, यह मेरे लिए बिल्कुल कुछ नहीं करता है। - Igor Ganapolsky
@IgorGanapolsky मैंने ऊपर दिए गए उत्तर को संपादित किया जो मेरे लिए काम करता था। अगर यह काम करता है तो मुझे बताएं! - Levi Figueira
मैंने आपके नए आदेशों की कोशिश की, लेकिन उन्होंने कुछ भी नहीं किया। - Igor Ganapolsky
मेह, यह अभी भी काम नहीं करेगा। - adi518


उत्तर में यहां भी बहुत भ्रम प्रतीत होता है।

git submodule init है नहीं जादुई रूप से .git / config (.gitmodules से) में सामान उत्पन्न करने का इरादा है। इसका उद्देश्य मूल परियोजना को क्लोन करने के बाद पूरी तरह से खाली उपनिर्देशिका में स्थापित करना है, या एक प्रतिबद्धता खींचना जो पहले गैर-मौजूदा सबमिशन को जोड़ता है।

दूसरे शब्दों में, आप एक का पालन करें git clone एक प्रोजेक्ट जिसमें पनडुब्बियां हैं (जिसे आप इस तथ्य से जान लेंगे कि क्लोन ने एक .gitmodules फ़ाइल की जांच की है) git submodule update --init --recursive

तुम करो नहीं का पालन करें git submodule add ... के साथ git submodule init (या git submodule update --init), यह काम नहीं करना चाहिए। वास्तव में, अगर चीजें काम करती हैं तो जोड़ पहले ही उपयुक्त .git / config को अपडेट कर देगा।

संपादित करें

यदि पहले से मौजूद गैर-मौजूदा गिट सबमिशन किसी और द्वारा जोड़ा गया था, और आप एक करते हैं git pull उस प्रतिबद्धता के बाद, उस सबमिशन की निर्देशिका पूरी तरह खाली हो जाएगी (जब आप निष्पादित करते हैं git submodule status नया सबमिशन हैश दिखाना चाहिए लेकिन एक होगा - इसके सामने।) इस मामले में आपको अपना पालन करने की आवश्यकता है git pull एक के साथ भी git submodule update --init (प्लस --recursive जब यह एक सबमिशन के अंदर एक सबमिशन है) नया, पहले गैर-मौजूदा, सबमिशन चेक आउट करने के लिए; सबमिड्यूल के साथ एक परियोजना के प्रारंभिक क्लोन के बाद (जहां स्पष्ट रूप से आपके पास पहले से ही उन सबोड्यूल्यूल नहीं थे)।


3
2017-12-27 17:52



यह दिलचस्प है, क्योंकि git help submodule इनिट के बारे में यह कहता है: "init: .gitmodules से .git / config में सबमिशन नामों और यूआरएल की प्रतिलिपि बनाकर इंडेक्स में दर्ज किए गए सबमिड्यूल को शुरू करें (जिन्हें कहीं और जोड़ा गया था)।" तो यह सुनिश्चित है आवाज़ जैसे यह वही करना चाहिए जो आप कहते हैं कि यह नहीं करता ...? गिट दस्तावेज पर अद्यतन के लिए समय? - Brad
@brad मुझे नहीं लगता कि मैंने कहा था - लेकिन मैंने उस विशिष्ट मामले के लिए एक स्पष्टीकरण जोड़ा। धन्यवाद। - Carlo Wood
@ करलोवुड कोई विचार है कि गिट submodules के लेखकों ने फैसला क्यों किया --init नए submodules प्राप्त करने के लिए आवश्यक होना चाहिए (उन्हें स्वचालित रूप से हथियाने के बजाय update)? ऐसा लगता है कि आपके भंडार को अद्यतन करने के लिए सबकुछ जरूरी है जब तक वह डेटा को नष्ट नहीं कर लेता। साथ में --init यह आपको यह बताने के लिए मजबूर करता है कि नए सबमिड्यूल बनाए गए हैं, या बस हमेशा जारी करें --init हर बार, इस मामले में, ऐसा लगता है कि यह डिफ़ॉल्ट रूप से सक्षम होना चाहिए। - Catskul
@Catskul जाहिर है मुझे नहीं पता कि गिट submodules के लेखकों ने कुछ भी फैसला क्यों किया, लेकिन मेरा अनुमान है कि "अद्यतन" पहले से मौजूद कुछ अद्यतन करने के लिए आरक्षित है, और "init" का उपयोग कुछ (स्थानीय रूप से) नया बनाने के लिए किया जाता है। हुड के तहत दोनों शायद एक अलग आदेश की गारंटी देने के लिए काफी अलग हैं। - Carlo Wood


डेव जेम्स मिलर के जवाब के मुताबिक मैं पुष्टि कर सकता हूं कि यह मेरे लिए काम करता है। यहां महत्वपूर्ण बात उपप्रोजेक्ट्स प्रतिबद्ध आईडी को प्रतिबद्ध करना था। बस .gitmodules में प्रवेश करने के लिए पर्याप्त नहीं था।

यहां एक उचित प्रतिबद्धता है:

https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae


2
2017-07-15 15:03





मुझे भी यही समस्या थी।

.gitmodules सबमिशन था, लेकिन एक के बाद git submodule init आदेश में यह नहीं था .git/config

डेवलपर को बाहर करता है जो सबमिशन को जोड़ता है, ने भी सबमिशन निर्देशिका को जोड़ा .gitignore फ़ाइल। यह काम नहीं करता है।


2
2018-01-28 03:44





जैसा कि मैंने पाया है कि गिट सबमिशन सिंक ऐसा नहीं करता है जिसे आप उम्मीद करते हैं। केवल एक स्पष्ट करने के बाद git submodule addफिर एक सबमिशन यूआरएल परिवर्तन करता है।

तो, मैंने इस स्क्रिप्ट को अंदर रखा है ~/bin/git-submodule-sync.rb:

https://gist.github.com/frimik/5125436

और मैं कुछ पोस्ट-प्राप्त गिट तैनाती स्क्रिप्ट पर एक ही तर्क का उपयोग करता हूं।

मुझे बस इतना करना है कि संपादित करें .gitmodules, फिर इस स्क्रिप्ट को चलाएं और अंततः काम करता है जैसे मैंने सोचा git submodule sync माना गया था।


2
2018-03-09 19:36



यह वास्तव में काम करता है। - JeffCharter
यह केवल कुछ repos पर होता है ... संभवतः गिट में कुछ बग के कारण। यह मेरे साथ नहीं हुआ है नए नए लंबे समय तक बनाए गए भंडारों, लेकिन जब वापस, यह कुछ repos पर हर समय होता था ... - fridh


जब मैंने इसे आज देखा, तो एक डेवलपर ने पेड़ का हिस्सा एक नई उप-निर्देशिका में स्थानांतरित कर दिया था और ऐसा लगता है कि उसके गिट क्लाइंट ने पेड़ में अद्यतन सबप्रोजेक्ट नियमों को रिकॉर्ड नहीं किया था, बल्कि वे सिर्फ निकल गए थे .gitmodules दोनों पुराने स्थानों और उपप्रोजेक्ट्स को संदर्भित करते हैं जो वर्तमान पेड़ में मौजूद नहीं थे।

सबमिड्यूल को वापस जोड़ना, और उन लोगों के लिए सबमिशन के प्रतिबद्ध शास की तुलना करना git show $breaking_commit_sha (regexp मिलान लाइनों के लिए खोजें ^-Subproject) आवश्यक निश्चित चीजों के रूप में समायोजित करने के लिए।


1
2018-04-30 21:00