मैं git सबमॉड्यूल में अपने परिवर्तन कैसे वापस करूं?


268

मेरे पास एक git सबमॉड्यूल (RestKit) है जिसे मैंने अपने रेपो में जोड़ा है।

मैंने गलती से वहां कुछ फाइलें बदल दी हैं और मैं स्रोत संस्करण पर वापस जाना चाहता हूं। ऐसा करने के लिए, मैंने दौड़ने की कोशिश की

Mac:app-ios user$ git submodule update RestKit

लेकिन जैसा कि आप यहां देख सकते हैं, यह काम नहीं किया क्योंकि यह अभी भी "संशोधित सामग्री" है:

Mac:app-ios user$ git status
...
#   modified:   RestKit (modified content)

यहाँ तक की

Mac:app-ios user$ git submodule update -f RestKit 

स्थानीय रूप से संशोधित फ़ाइलों को वापस नहीं करता है।
मैं उस सबमॉड्यूल की सामग्री को कैसे रीसेट करूं?


यदि git reset --hardकाम नहीं करता है, तो पहले दूरस्थ शाखा को निर्दिष्ट करने का प्रयास करें git reset --hard origin/<branch_name>
जेरी के।

जवाबों:


208

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


6
जब मैं वास्तव में कुछ भी नहीं बदला था सबमॉडल "परिवर्तन" को छोड़ने के लिए git सबमॉड्यूल अपडेट (- theit के बिना भी) ने मेरे लिए काम किया। यदि आप सबमॉड्यूल डायरेक्टरी में जाते हैं और git स्टेटस खाली आता है, तो रीसेट के बजाय इसे आज़माएं।
इक्लेक्टिक डीएनए

16
git submodule update --initमेरे लिए काम किया; इसके बिना --initयह बिल्कुल काम नहीं करता था।
प्रति लुंडबर्ग

उत्तम!! मैंने अपने रेपो में सबमॉडल में बदलाव किए, जहां मैंने इसे आयात किया। एंडीथिस ने इसे वापस वही कर दिया जो यह माना जाता था।
नोहितारत

2
रीसेट -हार्ड ने मेरे लिए काम नहीं किया, स्थानीय परिवर्तनों के कारण मेरा सबमॉड्यूल अभी भी विखंडित नहीं हो सका।
मल्हल

33
git submodule update -f --initमेरे केस के लिए @markshiz के अलावा ।
ओटियाई

279

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

git submodule foreach git reset --hard

आप सभी सबमॉड्यूल पर लागू करने के लिए पुनरावर्ती ध्वज का उपयोग भी कर सकते हैं:

git submodule foreach --recursive git reset --hard


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

4
ध्यान दें कि आप भी कर सकते हैंgit submodule foreach --recursive git clean -x -f -d
yoyo

1
अपनी मशीन पर (विंडोज 2.22.0 git का उपयोग करते हुए) - मुझे दूसरी गीट कमांड के आसपास सिंगल कोट्स की आवश्यकता होती है जब --recursive फ्लैग का उपयोग किया जाता है या यह काम नहीं करेगा: git सबमॉडल foreach --recursive 'git क्लीन -x -fd -d'
१wo

196

पिछले सभी उत्तरों की तुलना में अधिक विफल-सुरक्षित विधि:

git submodule deinit -f .
git submodule update --init

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


1
अफसोस कि यह मेरे मामले में काम नहीं किया (जीईटी सबमॉड्यूल में संशोधित स्थानीय फाइलों के साथ), "अपडेट - इनिट" कमांड error: Your local changes to the following files would be overwritten by checkout
स्पॉज

अद्यतन विशिष्ट submodule करने के लिए कार्य करें: $ Git submodule deinit -f - <submodule_path> और फिर $ Git submodule अद्यतन --init - <submodule_path>
प्रियंक

मैंने ऊपर सभी तरीकों की कोशिश की जब तक कि मुझे यह एक नहीं मिला। मेरे लिए, यह केवल एक ही है कि मेरे Git "क्लीन" देख मिल गया है (बिना *मेरे PS1कि git status -unoव्याख्या करने में असमर्थ था)।
गाइ रैपापोर्ट

60

मेरे लिए अच्छा है

git reset --hard

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

git submodule update --init

फिर जब मैं करता हूं git status, तो यह सबमॉडल पर साफ होता है।


पछतावा submodule update --initनहीं है वैसे भी मेरे मामले में स्थानीय संशोधनों को वापस करने के लिए: |
रोज़गारपैक

48

अनुक्रमिक 4 चरण करें:

git submodule foreach git reset --hard HEAD
git submodule update
git submodule foreach "git checkout master; git pull"
git submodule foreach git clean -f

2
केवल वही जिसने मेरी मदद की।
विक्टर सर्जियेंको

प्रश्न, यदि सबमॉड्यूल नया है, तो उस निर्देशिका के अंदर .IT फ़ाइल नहीं होगी, सही है? पेरेंट रेपो को git कमांड बबल देगा?
सांतियागो अरिज्ती

1
@ जियाउत ऐसा करने के बाद भी, मेरे पास अभी भी "(नया काम करता है") मेरे माता-पिता के पास से 'git स्टेटस' करते समय अपने सबमॉडल के बगल में?
डेविड डोरिया

1
@ दाविदोरिया मेरे लिए git submodule updateतय था (new commits)
ubershmekel

31

इसने मेरे लिए काम किया, जिसमें सबमॉड्यूल्स में पुनरावृत्ति शामिल है (शायद इसीलिए आपका -एफ़ काम नहीं किया, क्योंकि आपने सबमॉड्यूल के अंदर एक सबमॉड्यूल बदल दिया है):

git submodule update -f --recursive

11

पहले यह कोशिश करो, जैसा कि दूसरों ने कहा है:

git submodule update --init

अगर वह काम नहीं करता है, तो सबमॉड्यूल डायरेक्टरी में बदलाव करें और निम्न कमांड का उपयोग करके देखें कि क्या सबमॉडल में कोई बदलाव हैं:

git status

यदि आपके सबमॉडल में परिवर्तन होते हैं, तो उनसे छुटकारा पाएं। सत्यापित करें कि जब आप "स्थिति" चलाते हैं, तो आप कोई परिवर्तन नहीं देख सकते हैं।

अगला, मुख्य रिपॉजिटरी में वापस जाएं और "गिट सबमॉड्यूल अपडेट - इनिट" को फिर से चलाएं।


9

Git 2.14 (Q3 2017) के बाद से, आपको git reset(जैसा कि) करने के लिए प्रत्येक सबमॉड्यूल में जाने की आवश्यकता नहीं हैgit submodule foreach git reset --hard )

ऐसा इसलिए है क्योंकि जीआईटी रीसेट खुद जानता है कि अब कैसे सबमॉड्यूल्स में दोबारा जाना है।

प्रतिबद्ध देखें 35b96d1 (21 अप्रैल 2017), और f2d4899 , 823bab0 के लिए प्रतिबद्ध करें , स्टीफन बेलर ( ) द्वारा cd279e2 (18 अप्रैल 2017) प्रतिबद्ध करें(द्वारा विलय Junio सी Hamano - - में 5f074ca प्रतिबद्ध , 29 मई 2017)stefanbeller
gitster

बिल्टिन / रीसेट: ऐड - क्रेकस-सबमॉड्यूल स्विच

git-reset अभी तक एक और काम करने वाला ट्री मैनिप्युलेटर है, जिसे सबमॉड्यूल्स के बारे में सिखाया जाना चाहिए।

जब कोई उपयोगकर्ता गिट-रीसेट का उपयोग करता है और सबमॉड्यूल्स में फिर से जुड़ने का अनुरोध करता है, तो यह सबमॉड्यूल को सुपरप्रोजेक्ट में दर्ज किए गए ऑब्जेक्ट नाम के रूप में रीसेट करेगा, HEADs का पता लगाएगा।

चेतावनी : के बीच का अंतर:

  • git reset --hard --recurse-submodule तथा
  • git submodule foreach git reset --hard

यह है कि पूर्व में आपके मुख्य माता-पिता रेपो वर्किंग ट्री को भी रीसेट कर देंगे, क्योंकि बाद वाला केवल सबमोड्यूल्स को काम करने वाले ट्री को रीसेट करेगा।
इसलिए सावधानी के साथ प्रयोग करें।


7

Git <= 2.13 के लिए, इन दो आदेशों को पुनरावर्ती सबमोडुल्स के साथ अपने repos को रीसेट करना चाहिए:

git submodule foreach --recursive git reset --hard
git submodule update --recursive --init

3

यह हमारे पुस्तकालयों में GIT v1.7.1 के साथ काम करता है, जहां हमारे पास एक DEV पैकेज रेपो और LIVE पैकेज रेपो है। भंडार अपने आप में एक परियोजना के लिए परिसंपत्तियों को पैकेज करने के लिए एक शेल के अलावा कुछ भी नहीं हैं। सभी सबमॉड्यूल्स।

LIVE को कभी जानबूझकर अपडेट नहीं किया जाता है, हालांकि कैश फ़ाइल या दुर्घटनाएं हो सकती हैं, जिससे रेपो गंदा हो जाता है। DEV में जोड़े गए नए सबमॉड्यूल्स को LIVE के भीतर भी आरंभीकृत किया जाना चाहिए।

DEV में पैकेज रिपोजिटरी

यहां हम उन सभी अपस्ट्रीम परिवर्तनों को खींचना चाहते हैं जिनके बारे में हमें अभी तक जानकारी नहीं है, फिर हम अपने पैकेज रिपॉजिटरी को अपडेट करेंगे।

# Recursively reset to the last HEAD
git submodule foreach --recursive git reset --hard

# Recursively cleanup all files and directories
git submodule foreach --recursive git clean -fd

# Recursively pull the upstream master
git submodule foreach --recursive git pull origin master

# Add / Commit / Push all updates to the package repo
git add .
git commit -m "Updates submodules"
git push   

पैकेज रिपॉजिटरी LIVE में

यहां हम उन परिवर्तनों को खींचना चाहते हैं जो DEV रिपॉजिटरी के लिए प्रतिबद्ध हैं, लेकिन अज्ञात अपस्ट्रीम परिवर्तन नहीं।

# Pull changes
git pull

# Pull status (this is required for the submodule update to work)
git status

# Initialize / Update 
git submodule update --init --recursive

2

यदि आप उप मॉड्यूल के साथ-साथ संपूर्ण रिपॉजिटरी में सभी परिवर्तनों को छोड़ना चाहते हैं, तो आप उपयोग कर सकते हैं

git restore . --recurse-submodules

यह भंडार और उप मॉड्यूल में किए गए सभी परिवर्तनों को पूर्ववत कर देगा।


0

सभी सबमॉड्यूल (बिना अपनी "मास्टर" शाखा को बनाए रखने और रखने के लिए):

git सबमॉड्यूल foreach 'git चेकआउट मास्टर और& git रीसेट-hard $ sha1'

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