मैं git सबमॉड्यूल के साथ संघर्ष कैसे प्रबंधित करूं?


127

मेरे पास एक git सुपरप्रोजेक्ट है जो कई सबमॉड्यूल्स को संदर्भित करता है और मैं अपने प्रोजेक्ट के बाकी सदस्यों के लिए वर्कफ़्लो को लॉक करने की कोशिश कर रहा हूं।

इस प्रश्न के लिए, मान लीजिए कि मेरा सुपरप्रोजेक्ट कहलाता है superyऔर सबमॉड्यूल कहा जाता है subby। (तब मैं जो करने की कोशिश कर रहा हूं उसका एक सरलीकरण है ... मैं वास्तव में संस्करणों के लिए शाखाओं का उपयोग नहीं कर रहा हूं, लेकिन मुझे लगा कि एक प्रश्न के रूप में बाहर रखना आसान होगा।)

मेरी मास्टर ब्रांच के superyपास v1.0git प्रोजेक्ट का टैग है जो subbyएक सबमॉड्यूल के रूप में संदर्भित है। की शाखा ने superyबुलाया one.oneऔर टैग v1.1के बिंदु को इंगित करने के लिए सबमॉड्यूल के संदर्भ को बदल दिया subby

मैं बिना किसी अड़चन के इन शाखाओं में से प्रत्येक के भीतर काम कर सकता हूं, लेकिन अगर मैं one.oneशाखा से अपडेट के लिए शाखा को अपडेट करने की कोशिश करता हूं तो मुझे masterकुछ संघर्ष मिलते हैं और मैं उन्हें हल करने का तरीका नहीं बताता।

मूल रूप git pull . masterसे subbyशाखा में थोड़ी देर चलने के बाद , ऐसा लगता है कि यह अतिरिक्त सबमॉड्यूल बनाता है।

पुल / मर्ज करने से पहले, मुझे शाखा git submoduleसे वांछित प्रतिक्रिया मिलती है one.one:

$ git checkout master
$ git submodule
qw3rty...321e subby (v1.0)
$ git checkout one.one
$ git submodule
asdfgh...456d subby (v1.1)

लेकिन खींचने के बाद, जब मैं चलता हूं तो यह अतिरिक्त सबमॉड्यूल्स जोड़ता है git submodule:

$ git pull . master
Auto-merged schema
CONFLICT (submodule): Merge conflict in subby - needs qu3rty...321e
Automatic merge failed; fix conflicts and then commit the results.

$ git submodule
qw3rty...321e subby (v1.0)
asdfgh...456d subby (v1.1)
zxcvbn...7890 subby (v1.1~1)

मैं अवांछित उप-संदर्भों को कैसे हटा / अनदेखा कर सकता हूं और अपने संघर्षों और परिवर्तनों को कम कर सकता हूं? या क्या कोई ऐसा पैरामीटर है जिसे मैं अपने मूल के साथ उपयोग कर सकता हूं git pullजो मेरे सबमॉड्यूल्स को अनदेखा करेगा?

जवाबों:


23

मैंने उस सटीक त्रुटि को पहले नहीं देखा है। लेकिन आपको जो परेशानी हो रही है, उसका मुझे अंदाजा है। ऐसा लगता है कि क्योंकि लग रहा है masterऔर one.oneकी शाखाओं superyके लिए अलग refs शामिल subby, submodule जब आप से परिवर्तन मर्ज master- Git जो रेफरी पता नहीं है v1.0या v1.1- रखा और पता लगाया जाना चाहिए द्वारा one.oneकी शाखा supery

यदि ऐसा है, तो आपको उस परिवर्तन का चयन करने की आवश्यकता है जो आप चाहते हैं और संघर्ष को हल करने के लिए उस परिवर्तन को प्रतिबद्ध करें। ठीक यही आप रीसेट कमांड के साथ कर रहे हैं ।

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


1
प्रश्न पर कुछ प्रकाश डालने के लिए धन्यवाद। यह अब मेरे लिए पूरी तरह से समझ में आता है और ऊपर की स्थिति के लिए रीसेट कमांड पूरी तरह से काम करता है। लेकिन मास्टर शाखा से सबमॉडल रेफरी को स्वीकार करने और वर्तमान शाखा के सबमॉड्यूल में रेफ को फेंकने के आदेश क्या होंगे? मुझे पता है कि सामान्य संघर्षों को कैसे संभालना है, लेकिन वेब के तीन दिनों के बाद, मुझे rm -r के अलावा एक कोड उदाहरण नहीं मिल रहा है। और मैं सोचने लगा हूं कि उदाहरणों के मौजूद न होने का एक कारण है; सबमॉड्यूल अब तक सुपरप्रोजेक्ट से अलग है कि आपको हर संक्रमण का प्रबंधन करना होगा।
टायलर

26
आखिरकार! एक जवाब! मैं था added by us: ../Mono.Cecilमें git statusलेकिन git addऔर git rmके साथ विफल Mono.Cecil: needs merge, pathspec 'Mono.Cecil/' did not match any filesक्योंकि यह सिर्फ एक खाली फ़ोल्डर और Git केवल वास्तव में हैंडल फ़ाइलों था। git checkoutमुझे दिया Mono.Cecil: needs merge, error: you need to resolve your current index first, git submodule updateदिया Skipping unmerged submodule Mono.Cecilऔर अंतिम रूप से git checkout master Mono.Cecilतय किया। मूल समस्या: git statusसुझाव गलत है, इसलिए एक शाखा चुनें और फ़ोल्डर की उसकी प्रति लेकर जाएं checkout!
IBBoard

6
@ द्वारा IBBoard के आदेश मुझे इस स्थिति से मदद की - मैंने कोशिश की git checkout --ours SUBMODऔर git add SUBMODऔर अन्य लोगों, लेकिन अंत में ऐसा करने git checkout master SUBMODसंघर्ष तय की। यह टिप्पणी शायद एक उत्तर होनी चाहिए, एक टिप्पणी नहीं ... :)
कॉलिन डी बेनेट

89

ठीक है, इसके तकनीकी रूप से सबमॉड्यूल्स के साथ संघर्ष का प्रबंधन नहीं है (यानी: इसे रखें लेकिन ऐसा नहीं है), लेकिन मुझे काम करना जारी रखने का एक तरीका मिला ... और मुझे बस इतना करना था कि अपने git statusआउटपुट पर ध्यान दें और सबमॉड्यूल को रीसेट करें:

git reset HEAD subby
git commit

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


मेरे लिए यह केवल परस्पर विरोधी मॉड्यूल की स्थिति को "संशोधित" से बदलकर "हटा दिया गया" लगता है।
मैट ज़ुकोव्स्की

4
आप इसके बजाय मर्ज की गई शाखा के सबमॉड्यूल को रखना चाह सकते हैं: git रीसेट <मर्ज-ब्रांच> सबबी
एडवर्ड एंडरसन

1
मेरे लिए उत्तर में दिए अनुसार काम करता है .. git रीसेट HEAD पाथ / / to / submodule / dir
estoy

56

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

  1. भागो git status- संघर्ष के साथ सबमॉड्यूल फ़ोल्डर का एक नोट बनाएं
  2. वर्तमान संस्करण में पिछली बार किए गए संस्करण के लिए सबमॉड्यूल रीसेट करें:

    git reset HEAD path/to/submodule

  3. इस बिंदु पर, आपके पास अपने सबमॉड्यूल का एक संघर्ष-मुक्त संस्करण है जिसे आप अब सबमॉड्यूल के भंडार में नवीनतम संस्करण में अपडेट कर सकते हैं:

    cd पाथ / to / submodule
    git सबमॉड्यूल foreach git पुल मूल SUBMODULE-BRANCH-NAME
  4. और अब आप यह कर सकते हैं commitऔर काम पर वापस आ सकते हैं।


16

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

~/supery/subby $ git co hashpointerhere
~/supery/subby $ cd ../
~/supery $ git add subby
~/supery $ git commit -m 'updated subby reference'

इसने मेरे लिए अपने काम को सही हैश संदर्भ में लाने के लिए और आगे के संघर्षों को प्राप्त किए बिना अपने काम को जारी रखने के लिए काम किया है।


1
या आप बस एक चेक चेकआउट कर सकते हैं
बाची

@ बाची: git चेकआउट - उनकी और --ours सबमोडुल्स पर कोई प्रभाव नहीं है।
एडवर्ड एंडरसन

1
हालांकि यह संघर्ष को हल करता है, यह निर्धारित करना आसान नहीं है <hashpointerhere>। मैं एक आसान तरीका नहीं जानता कि संघर्ष के प्रत्येक पक्ष में सबमॉड्यूल कमेटी को देखा जाए। सबबी में आप जो भी जांच करते हैं वह मर्ज के दोनों ओर से अलग हो सकता है, जो मर्ज कमिट में उचित नहीं है।
एडवर्ड एंडरसन

@nilbus जो सच है। हमने गिट सबमॉडल्स के साथ काम करना छोड़ दिया है क्योंकि यह एक चिंता थी जो हमारे पास थी और यह बताना बहुत कठिन था कि वास्तव में हम क्या चाहते थे। हमने पैकेज मैनेजर के रूप में कंपोज़र (php) का उपयोग किया है, जो मुझे वास्तव में पसंद है क्योंकि यह एक निश्चित hh के लिए रिपोज को लॉक करने वाली लॉक फाइल बनाता है। हालाँकि, चूंकि हम कई रिपोज के भीतर नोड_मॉड्यूल्स का उपयोग कर रहे हैं, हम यहां और वहां परस्पर विरोधी मॉड्यूल में चले जाएंगे। हमने इस सामान को प्रबंधित करने के लिए npm पर स्विच किया है, लेकिन यह कीड़े का एक पूरा अन्य कैन भी है।
नरकांत

12

मुझे git rebase -i origin/masterएक शाखा के साथ यह समस्या थी । मैं सबमॉडल रेफरी का मास्टर संस्करण लेना चाहता था, इसलिए मैंने बस:

git reset master path/to/submodule

और फिर

git rebase --continue

इससे मेरे लिए समस्या हल हो गई।


3
इसने मेरे लिए काम किया। मैं अभी भी समझ रहा हूं कि उन्होंने
सबमॉडल

3

इस चर्चा से मदद मिली। मेरे मामले में

git reset HEAD subby
git commit

मेरे लिए काम किया :)


2

खैर अपनी मूल निर्देशिका में मैं देख रहा हूँ:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)

तो मैंने बस यही किया

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