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çinerror: 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?
FYI '--abort' bayrağı da rebase için çalışıyor. – approxiblue
@ 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
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