2009-05-05 12 views
72

मेरे पास एक गिट सुपरप्रोजेक्ट है जो कई सबोड्यूल्यूल का संदर्भ देता है और मैं अपने प्रोजेक्ट सदस्यों के बाकी हिस्सों के लिए वर्कफ़्लो को लॉक करने का प्रयास कर रहा हूं।मैं गिट submodules के साथ संघर्ष कैसे प्रबंधित करूं?

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

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

मैं मैं उन्हें कैसे हल करने के लिए नहीं है बिना किसी अवरोध के इन शाखाओं में से प्रत्येक के भीतर काम कर सकते हैं, लेकिन मैं कुछ मतभेद प्राप्त अगर मैं master शाखा से परिवर्तन के साथ one.one शाखा अद्यतन करने के लिए कोशिश करते हैं और।

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

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

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

लेकिन पुल के बाद, यह अतिरिक्त submodules जब मैं चलाने कहते हैं 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 के साथ कर सकता हूं जो मेरे सबोड्यूल्यूल को अनदेखा कर देगा?

उत्तर

11

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

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

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

+1

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

+19

आखिरकार! एक जवाब! मैंने हमारे द्वारा जोड़ा था: ../ मोनो 'सेसिल' 'गिट स्टेटस 'में, लेकिन' गिट एड 'और' गिट आरएम '' मोनो के साथ असफल रहा। सेसिल: मर्ज की ज़रूरत है, पथस्पेक' मोनो.सीसिल/'किसी से मेल नहीं खाती फाइलें 'क्योंकि यह सिर्फ एक खाली फ़ोल्डर था और गिट केवल फाइलों को संभालती है। 'गिट चेकआउट' ने मुझे 'मोनो' सेसिल दिया: मर्ज की जरूरत है, त्रुटि: आपको अपनी वर्तमान इंडेक्स को पहले हल करने की जरूरत है ',' गिट सबमिशन अपडेट 'ने' अनमोल सबमिशन को छोड़कर मोनो.सेसिल 'और' गिट चेकआउट मास्टर मोनो। सेसिल 'फाइनली ठीक कर दिया। मूल समस्या: 'गिट स्थिति' सुझाव गलत है, इसलिए शाखा चुनें और फ़ोल्डर की प्रतिलिपि 'चेकआउट' के साथ लें! – IBBoard

+2

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

55

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

git reset HEAD subby 
git commit 

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

+0

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

+2

आप विलय की शाखा के सबमिशन को इसके बजाय रखना चाहते हैं: गिट रीसेट <मर्ज-शाखा> सबबी –

+1

उत्तर में निर्धारित अनुसार मेरे लिए काम करता है .. गिट रीसेट हेड पथ/से/सबमिशन/डीआईआर – estoy

12

सबसे पहले, हैश को संदर्भित करें जिसे आप संदर्भित करना चाहते हैं। तो

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

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

+0

यह अधिक अपवित्र होना चाहिए। – J0hnG4lt

+1

या आप केवल एक गिट चेकआउट कर सकते हैं --theirs (या --ours) subby – Bachi

+0

@ बाची: गिट चेकआउट --थीर्स और --ours का सबमिड्यूल पर कोई प्रभाव नहीं पड़ता है। –

18

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

git reset HEAD path/to/submodule

  • इस poi पर: -

    1. भागो git status संघर्षों के साथ submodule फ़ोल्डर को नोट बनाने
    2. संस्करण है कि वर्तमान शाखा में प्रतिबद्ध अंतिम बार करने के लिए submodule रीसेट NT, आप अपने submodule की एक संघर्ष-मुक्त संस्करण है जो आप अब submodule के भंडार में नवीनतम संस्करण में अपडेट कर सकते हैं:

      cd path/to/submodule 
      git submodule foreach git pull origin SUBMODULE-BRANCH-NAME
    3. और अब आप कि commit और वापस काम पर मिल सकती है।

  • +1

    एकमात्र स्पष्ट और कामकाजी समाधान अपवोट –

    +0

    यह मेरे लिए भी काम करता है। यह अधिक अपवित्र –

    6

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

    git reset master path/to/submodule

    और फिर

    git rebase --continue

    वह मेरे लिए समस्या हल हो।

    +3

    के लिए पात्र है यह मेरे लिए काम किया। मैं अभी भी यह पता लगा रहा हूं कि उन्होंने सबमिशन को नुकसान पहुंचाने के लिए क्या किया –

    0

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

    git reset HEAD subby 
    git commit 
    

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

    0

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

    $ 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 
    
    संबंधित मुद्दे