2015-08-04 36 views
11

Git altmodülleri ile çalışmanın, genellikle belirli bir alt modülleri içeren ve normal bir dizinle aynı kodu temsil eden işlemler arasında birleşen sorunlarla karşılaştığımı buluyorum. Küçük çoğaltma örnek:Dizinin alt modüle dönüştürüldükten sonra birleştirilmesi

# Create one project, to be used as a subproject later on 
git init a 
cd a 
echo aaa > aa 
git add -A 
git commit -m a1 
cd .. 

# Create a second project, containing a as a normal directory initially 
git init b 
cd b 
mkdir a b 
echo aaa > a/aa 
echo bbb > b/bb 
git add -A 
git commit -m b1 

# Replace directory with submodule 
git rm -r a 
git submodule add ../a a 
git commit -m b2 

# Try to create branch from the pre-submodule state of affairs 
git checkout -b branch HEAD^ 

Bu zaten bir hata veriyor:

hatayı önlemek için
error: The following untracked working tree files would be overwritten by checkout: 
    a/aa 
Please move or remove them before you can switch branches. 
Aborting 

, ben her şeyden önce alt modül deinitialize:

# Create feature brach starting at version without submodule 
git submodule deinit . 
git checkout -b branch HEAD^ 
echo abc > b/bb 
git commit -a -m b3 

Eğer görebileceğiniz gibi özellik dalı alt modülle tamamen ilgisizdir, farklı bir dosya kümesini değiştirir. Bu tüm problemi özellikle can sıkıcı kılıyor.

# Try to merge the feature branch 
git checkout master 
git merge branch 

Bu tam olarak anlamıyorum bir hata mesajı ile tekrar başarısız: Ben git merge branch önce git submodule update --init yaparsanız

CONFLICT (file/directory): There is a directory with name a in branch. Adding a as a~HEAD 
Automatic merge failed; fix conflicts and then commit the result. 

aynı hatayı alıyorum. Ama hiçbir yerde a~HEAD görmüyorum, benim dizin ağacında ne de böyle okur git status çıktısında, içinde ne:

error: unable to index file a 
fatal: updating files failed 
: Ben önerildiği gibi git add a yaparsanız

On branch master 
You have unmerged paths. 
    (fix conflicts and run "git commit") 

Changes to be committed: 

    modified: b/bb 

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

    added by us:  a 

, başka hata alıyorum

Birleştirme işleminden hemen önce git submodules update --init yaparsam, git add a'u başarıyla yapabilirim. Ben bu durumdan kurtarmak nasıl

Submodule 'a' (…/a) registered for path 'a' 
Skipping unmerged submodule a 

: Ben bunu, sonra birleştirme işlemi sonrasında bunu denemek unutursam Ama bu hata iletisini?git merge --abort'dan başka bir şey, git rebase gibi şeyler için kullanmak istediğimden beri, ve bazı senaryolarda (nasıl yeniden üretileceğini bilmediğim için) temiz birleştirme işlemini bile iptal edemedim. yerine sıfırlama.

İlk etapta nasıl önleyebilirim? Birleştirme sırasında submodules vs dizinleri ile doğru şeyi yapmasını sağlayan bir sihir ayarı var mı? Böylece, sadece alt modüller ile ilgisi olmayan dosyaları değiştiren bir birleşmeyi elle işlemek zorunda kalmamalıyım?

+0

FYI '--abort' bayrağı da rebase için çalışıyor. – approxiblue

+0

@ user880772: Evet, ancak tüm rebase'ı iptal ediyor, bu da yol boyunca bazı çatışmalar yaşanırsa kayda değer bir çabanın kaybedilebileceği anlamına geliyor. – MvG

+1

Git [alt modül birleştirme işlemez] (https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/). Her zamanki büyülü yolunda değil. Birleştirme işleminden önce submodule güncellemesini çalıştırmayı unutmak istemiyorsanız, "birleştirme" özelliğini bir takma adıma dönüştürebilirsiniz (bunu düşündüren bir şey hissediyorum). Bunun etrafında temiz bir yol göremiyorum. – approxiblue

cevap

2

Hayır eklememelisiniz, birleştirmenin değişmesi gerekmez. Ne çalışmalıdır Yani bir için "chage" görmezden

git reset a 

olduğunu.

PS: görünüşte git'e sadece bir dizinin existense denetler, bu nedenle birleştirme önce

git submodule deinit a 
rmdir a 

, eğer başarılı olur. İstediğin şeyin bu olduğundan emin değilim.

0

Alt modüle dönüştürmesi gereken klasörü içeren kodu birleştirdiğimde benzer bir sorunla karşılaştım.

Sonra ben herhangi bir çatışma olmadan git rebase olacak depoyu temizlemek için git gc yeni kaynak kodundan klasörü kaldırmak için BFG --delete-folders kullanarak bu çözüldü ve.