2014-10-28 8 views
10

मेरे पास दो शाखाएं A और B हैं। दोनों में एक सबमिशन (फ़ोल्डर sub में) होता है, हालांकि अलग-अलग कामों पर (जो एक से दूसरे तक तेजी से आगे नहीं बढ़ते)।गिट सबमिशन संघर्ष को हल करने के लिए कैसे करें यदि सबमिशन प्रारंभ नहीं किया गया है

A B 
|/
BASE 

मैंने A की जांच की है, लेकिन सबमिशन अभी तक शुरू नहीं हुआ है। अब मैं B मर्ज करता हूं और मुझे सबमिशन पर एक संघर्ष मिलता है।

$ git status 
Unmerged paths: 
    (use "git add <file>..." to mark resolution) 

     both modified: sub 

जारी git checkout --ours sub कुछ नहीं करता है (यदि submodule आरंभ नहीं हो जाता यह काम करता है, यह भी git checkout-index -f --stage=2 -- sub काम नहीं करता है)। git add sub त्रुटि error: pathspec 'sub' did not match any file(s) known to git. का कारण बनता है।

$ git diff sub 
diff --cc sub 
index 533da4e,ab2af77..0000000 
--- a/sub 
+++ b/sub 
@@@ -1,1 -1,1 +1,1 @@@ 
- Subproject commit 533da4ea00703f4ad6d5518e1ce81d20261c40c0 
-Subproject commit ab2af775ec467ebb328a7374653f247920f258f3 
++Subproject commit 0000000000000000000000000000000000000000 

git submodule init -- sub कुछ भी नहीं करता है। git submodule update --init --force -- sub काम नहीं करता है: Skipping unmerged submodule sub

तो, मैं इस सबमिशन संघर्ष को कैसे हल कर सकता हूं (मर्ज को निरस्त किए बिना और सबमिशन शुरू करने के बाद पुनः प्रयास करें)?

उत्तर

12

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

इंडेक्स को अपडेट करने का एक तरीका git reset के साथ है। यदि आप एक प्रतिबद्धता जानते हैं जिसमें सबमिशन एक ऐसे राज्य में है जिसे आप चाहते हैं, तो आप इसका उपयोग कर सकते हैं। उदाहरण के लिए, निम्न में से कोई हो सकता है कि आप क्या चाहते:

git reset master -- sub 
git reset [email protected]{upstream} -- sub 
git reset HEAD -- sub 
git reset MERGE_HEAD -- sub 

अन्य विकल्प अनुक्रमणिका को अपडेट करने के लिए सीधे पाइपलाइन आदेश git update-index का उपयोग कर रहा है। ऐसा करने के लिए, आपको यह जानने की जरूरत है कि टाइप गिटलिंक (यानी, एक अभिभावक भंडार में निर्देशिका प्रविष्टि जो एक सबमिशन को इंगित करती है) 0160000 है। पहले सिद्धांतों से इसे समझने का कोई तरीका नहीं है, लेकिन आप इसे समझ सकते हैं git ls-files -s या संदर्भ निम्नलिखित (देखें "1110 (gitlink)" 4-बिट ऑब्जेक्ट प्रकार के नीचे): https://github.com/gitster/git/blob/master/Documentation/technical/index-format.txt

कि दृष्टिकोण, का उपयोग करने के हैश आप, तो चलाने के लिए submodule सेट करना चाहते हैं, उदाहरण के लिए यह पता लगाने:

git update-index --cacheinfo 0160000,533da4ea00703f4ad6d5518e1ce81d20261c40c0,sub 
2

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

आपके मामले में, आपके पास सबमिशन पथ पर कोई सही विलय परिणाम की सामग्री नहीं हो सकती है और कोई सामग्री नहीं है। एकमात्र चीज आवश्यकHEAD में सही प्रतिबद्ध आईडी के साथ उस पथ पर एक रेपो होना है। युक्त रेपो वास्तव में कम परवाह नहीं कर सकता था, जहां उस पथ पर सबमिशन रेपो आया था, इस बिंदु पर महत्वपूर्ण एकमात्र चीज यह है कि HEAD में आईडी प्रतिबद्ध करें।

+2

अच्छा "यह सामान्य मर्ज की तरह काम करता है", हालांकि 'गिट चेकआउट --ours' और' git add' काम नहीं करता है। "उस पथ पर सही सामग्री की आपूर्ति कैसे करें"?- "केवल एक चीज है कि उस रास्ते पर रेपो को हेड में सही प्रतिबद्ध आईडी के साथ रखना है" - लेकिन मैं यह कैसे प्राप्त कर सकता हूं कि सबमिशन शुरू करने के रूप में काम नहीं करता है? – MrTux

+0

एक सबमिशन सिर्फ एक रेपो है। "केवल एकमात्र चीज है कि उस पथ पर ** रेपो ** होना चाहिए"। 'गिट क्लोन यू: // आर/एल-बी $ yourbranch पथ/से/रेपो; गिट जोड़ें पथ/से/रेपो; गिट प्रतिबद्ध -एम किया '। – jthill

+0

यह विकल्प मेरे लिए काम किया। मैंने बस सबमिशन स्थान में लापता रेपो के सही संस्करण को क्लोन किया और फिर विलय हो गया। –

संबंधित मुद्दे