Git alt modülleri ile çakışmaları nasıl yönetirim?


128

Birkaç alt modüle başvuran bir git süper projem var ve proje üyelerimin geri kalanı için bir iş akışını kilitlemeye çalışıyorum.

Bu soru için, süper projemin çağrıldığını superyve alt modülün çağrıldığını varsayalım subby. (O zaman yapmaya çalıştığım şeyin bir basitleştirmesidir ... Aslında dalları sürümler için kullanmıyorum, ancak soru olarak ortaya koymanın en kolay olacağını düşündüm.)

Ana dalım, alt modül olarak başvurulan git projesinin superyetiketine v1.0sahip subby. Dalı superyolarak adlandırılan one.oneve etikete noktasına altmodülün referansını değiştirdi v1.1arasında subby.

Bu şubelerin her birinde sorunsuz çalışabilirim, ancak one.oneşubeyi şubeden değişikliklerle güncellemeye çalışırsam masterbazı çatışmalar alıyorum ve bunları nasıl çözeceğimi bilmiyorum.

Temelde dalda bir git pull . mastersüre çalıştıktan sonra subby, ek alt modüller yaratıyor gibi görünüyor.

Çekme / birleştirme önce, istenen yanıt almak git submoduleden one.onedalı:

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

Ancak çekmeden sonra, çalıştırdığımda ek alt modüller ekliyor 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)

İstenmeyen alt modül referanslarını nasıl silerim / yok sayarım ve çakışmalarımı ve değişikliklerimi nasıl gerçekleştiririm? Veya orijinalimle kullanabileceğim, git pullalt modüllerimi yok sayacak bir parametre var mı?

Yanıtlar:


23

Daha önce bu hatayı tam olarak görmemiştim. Ama karşılaştığınız sorun hakkında bir tahminim var. Görünüşe göre masterve one.onedalları alt modül superyiçin farklı referanslar içerdiğinden, subbygit'ten değişiklikleri birleştirdiğinizde masterhangi ref - v1.0veya v1.1- one.oneşubesi tarafından tutulması ve izlenmesi gerektiğini bilmiyor supery.

Eğer durum buysa, istediğiniz referansı seçmeniz ve çatışmayı çözmek için bu değişikliği yapmanız gerekir. Reset komutuyla yaptığınız tam olarak budur .

Bu, projenizin farklı dallarındaki bir alt modülün farklı sürümlerini izlemenin zor bir yönüdür. Ancak alt modül ref, projenizin diğer bileşenleri gibidir. İki farklı dal, birbirini izleyen birleştirmelerden sonra aynı ilgili alt modül referanslarını izlemeye devam ederse, git, gelecekteki birleşmelerde birleştirme çatışmalarını artırmadan kalıbı çözebilmelidir. Öte yandan, alt modül referanslarını sık sık değiştirirseniz, çok sayıda çatışma çözme işlemine katlanmak zorunda kalabilirsiniz.


1
Soruya biraz ışık tuttuğunuz için teşekkürler. Bu şimdi benim için tamamen mantıklı ve sıfırlama komutu yukarıdaki durumum için mükemmel çalışıyor. Ancak, ana daldan alt modülü ref kabul etme ve referansı geçerli dalın alt modülüne atma komutları ne olur? Normal çatışmaları nasıl halledeceğimi biliyorum, ancak üç gün boyunca web'i taradıktan sonra rm -r dışında bir kod örneği bulamıyorum. Ve örneklerin var olmamasının bir nedeni olduğunu düşünmeye başlıyorum; alt modül süper projeden o kadar soyutlanmıştır ki, her geçişi yönetmeniz gerekir.
Tyler

26
EN SONUNDA! Bir cevap! Ben added by us: ../Mono.Cecilde git statusancak git addve git rmbaşarısız Mono.Cecil: needs merge, pathspec 'Mono.Cecil/' did not match any filesSadece boş klasör ve git sadece gerçekten kolları dosyaları çünkü. git checkoutbana verdi Mono.Cecil: needs merge, error: you need to resolve your current index first, git submodule updateverdi Skipping unmerged submodule Mono.Cecilve git checkout master Mono.CecilSONUNDA düzeltti. Temel sorun: git statusöneri yanlış, bu yüzden bir dal seçin ve klasörün kopyasını alın checkout!
IBBoard

6
IBBoard emri bu durumla bana yardımcı @ - Denedim git checkout --ours SUBMODve git add SUBMODdiğerleri, ama sonunda yapıyor git checkout master SUBMODçatışma sabit. Bu yorum muhtemelen bir cevap olmalı, yorum değil ... :)
Colin D Bennett

90

Eh, teknik olarak alt modüller ile çatışmaları yönetmiyor (yani: bunu sakla ama bunu yapma), ama çalışmaya devam etmenin bir yolunu buldum ... ve tek yapmam gereken git statusçıktılarıma dikkat etmek ve alt modülleri sıfırlamaktı:

git reset HEAD subby
git commit

Bu, alt modülü ön çekme kaydına sıfırlar. Bu durumda tam olarak istediğim şey buydu. Ve alt modüle uygulanan değişikliklere ihtiyaç duyduğum diğer durumlarda, standart alt modül iş akışlarına sahip olanlarla ilgileneceğim (ana ödeme, istenen etiketi aşağı çekme, vb.).


Benim için bu sadece çakışan modülün durumunu "her ikisi de değiştirildi" den "silindi" olarak değiştiriyor gibi görünüyor.
Matt Zukowski

4
Bunun yerine birleştirilmiş şubenin alt modülünü tutmak isteyebilirsiniz: git reset <merged-branch> subby
Edward Anderson

1
cevapta belirtildiği gibi benim için çalışıyor .. git reset HEAD yol / to / alt modül / dizin
estoy

56

Bu soruya verilen cevaplarla biraz uğraştım ve benzer bir SO gönderisindeki cevaplarda pek şansım olmadı. Bu benim için işe yarayan şeydi - benim durumumda, alt modülün farklı bir ekip tarafından sürdürüldüğünü ve bu nedenle çatışmanın, üzerinde çalıştığım projenin ana ve yerel şubemdeki farklı alt modül versiyonlarından geldiğini akılda tutarak:

  1. Çalıştır git status- çakışma içeren alt modül klasörünü not edin
  2. Alt modülü, geçerli dalda en son kaydedilen sürüme sıfırlayın:

    git reset HEAD path/to/submodule

  3. Bu noktada, alt modülünüzün çakışmasız bir sürümüne sahipsiniz ve bu sürümü artık alt modülün deposundaki en son sürüme güncelleyebilirsiniz:

    cd yolu / / alt modüle
    git submodule foreach git pull origin SUBMODULE-BRANCH-NAME
  4. Ve şimdi bunu yapabilir commitve işe geri dönebilirsiniz.


16

İlk olarak, referans almak için alt modülünüzden istediğiniz hash'i bulun. o zaman koş

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

bu benim alt modülümü doğru karma referansa almam ve daha fazla çatışma olmadan işime devam etmem için çalıştı.


1
ya da git checkout --theirs (veya - senin) subby
Bachi

@Bachi: git checkout --theirs ve --ours'un alt modüller üzerinde etkisi yoktur.
Edward Anderson

1
Bu, çatışmayı çözse de <hashpointerhere> 'i belirlemek kolay değildir. Çatışmanın her iki tarafında alt modül işleminin kontrol edildiğini görmenin kolay bir yolunu bilmiyorum. Altta teslim ettiğiniz taahhüt, birleştirmenin her iki tarafından da farklı olabilir ve bu, bir birleştirme işleminde uygun değildir.
Edward Anderson

@nilbus bu doğru. Git alt modülleri ile çalışmayı bıraktık çünkü endişelerimizden biri buydu ve gerçekte hangi taahhüdü istediğinizi söylemeyi çok zorlaştırdık. Composer'ı (php) bir paket yöneticisi olarak kullandık, bu aslında depoları belirli bir hash'e kilitleyen bir kilit dosyası yarattığı için hoşuma gidiyor. Bununla birlikte, çoklu depolarda node_modules kullandığımız için, burada ve orada çakışan modüllerle karşılaşacağız. O zamandan beri bu şeyleri yönetmek için npm'ye geçtik ama bu aynı zamanda tamamen başka bir solucan kutusu.
hellatan

12

Bu problemi git rebase -i origin/masterbir şubeyle yaşadım . Alt modül referansının master versiyonunu almak istedim, bu yüzden basitçe yaptım:

git reset master path/to/submodule

ve sonra

git rebase --continue

Bu benim için sorunu çözdü.


3
Bu benim için çalıştı. Hala alt
modüle

3

Bu tartışmadan yardım aldım. Benim durumumda

git reset HEAD subby
git commit

benim için çalıştı :)


2

Ana dizinimde şunu görüyorum:

$ 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)

Ben de bunu yaptım

git reset HEAD linux
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.