Git alt modüllerini özyinelemeli olarak günceller


284

Proje ekibim

ProjectA
-FrameworkA (submodule)
--Twig (submodule of FrameworkA)

Alt modülleri tekrar tekrar nasıl güncelleyebilirim? Zaten bazı git komutlarını denedim (ProjectA kökü üzerinde)

git submodule foreach git pull origin master

veya

git submodule foreach --recursive git pull origin master

ancak Twig dosyalarını çekemez.


Git-deep'e ne dersin ?
Mathew Kurian

Yanıtlar:


609
git submodule update --recursive

Ayrıca, başlatılmamış alt modüllerin başlatılmasını sağlayacak --init seçeneğini de kullanmak isteyeceksiniz:

git submodule update --init --recursive

Not: Git'in bazı eski sürümlerinde , --initseçeneği kullanırsanız , önceden başlatılmış alt modüller güncellenmeyebilir. Bu durumda, komutu seçeneksiz olarak da çalıştırmalısınız --init.


1
Özyinelemeli alt modüle ne dersiniz? "git submodule add FrameworkA.git" sadece FrameworkA dosyalarını çekin.
complez

2
Sadece "git submodule add blah add" ve sonra "git submodule update --init --recursive" yapabilirsiniz.
drewag

Bu benim yolumdan farklı mı?
William Entriken

3
@Irineau Kullanılmışsa, henüz başlatılmış alt modüllerin güncellenmemesi ile ilgili not --initGit 2.2.2'deki deneyimlerimle eşleşmiyor. Kullandığımda doğru taahhüdün alınmasıyla zaten başlatılmış olan hem üst düzey hem de iç içe alt modülleri görüyorum git submodule update --init --recursiveve bence komutu ile ve onsuz çalıştırmanız gerektiği iddiası --initsadece yanlış. Birisi bunun davranış olduğunu kanıtlayamadıkça veya sürümler arasında değiştiğini ve bir zamanlar doğru olduğunu göstermedikçe, tamamen düzenlemeyi planlıyorum.
Mark Amery

3
@MarkAmery, Git'in bazı sürümlerinde hatırlayamadığım bir sorun olduğunu hatırlıyorum. Ben sadece 1.9.3'te test ettim ve sorun artık var gibi görünmüyor. Cevabı belirsiz bir "eski versiyonlara" atıfta bulunmak için güncelledim. Herkes hangi sürümün bu davranışı değiştirdiğini belirleyebilirse, bu harika olurdu.
drewag

35

Benim kullanma şeklim:

git submodule update --init --recursive
git submodule foreach --recursive git fetch
git submodule foreach git merge origin master

6
Son satırı şu şekilde değiştirerek çalıştım:git submodule foreach git pull --ff-only origin master
Gilad Peleg

2
Ben de - son satırına recursive eklersiniz: "git submodule foreach - recursive git merge origin master" aksi takdirde kendisini bir alt modül güncellediğinde kirli bir alt modül alabilirsiniz.
Michael Scott Cuthbert

Bunu son üç saattir arýyorum. Teşekkürler bayım. Bu eklemek için, ayrıca gibi işlemekten bu komutları kullanabilirsiniz: git submodule foreach --recursive 'git commit -a | :'. :Sonucu ne olursa olsun bu döngü yapar. Bkz. Bağlantı stackoverflow.com/questions/19728933/… .
Acemi Pidgeon

17

Ne olursa senin Altmodüllerin varsayılan dalı olduğunu olur değil master (benim durumumda çok olur), bu şimdiye tam seyahatseverlerin Git altmodüller yükseltmeleri otomatikleştirmek nasıl:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

Bu komutu genel Makefile'imde eklemeye çalıştım, ancak hala GNU yapmak için sıkıştım . Basit tırnak içinde olmasına rağmen, $ (...) dizisinin yorumunu görmezden gel . Bir fikri olan var mı?
Sebastien Varrette

Senin emrin ihtiyacım olan şey, teşekkürler! Ama anlıyorum: alt modül Entering 'Core' fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.neredeCore
Sanandrea

Ayrıca, bu yorumu anlamanız gerekiyor sanırım stackoverflow.com/a/18008139/3383543
Ahmad AlMughrabi

özyinelemeli seçeneğe sahip olmamanız, bunun yalnızca alt modülleriniz tekrar alt modül içermiyorsa işe yaradığı anlamına gelir.
erikbwork

15

Son Git'te (v2.15.1 kullanıyorum) aşağıdakiler, yukarı akış alt modül değişikliklerini alt modüllere özyineli olarak birleştirecektir:

git submodule update --recursive --remote --merge

Sen ekleyebilir --initherhangi başlatılmamış submodules ve kullanımını başlatmak için--rebase yerine birleştirme rebase istiyorum.

Daha sonra değişiklikleri yapmanız gerekir:

git add . && git commit -m 'Update submodules to latest revisions'

Bu, yanlış bir şey yaptığımı sanıyordum ama cevabın bana git submodule update --remote my-dir/my-submoduleda iyi geldiğini doğruladı
iomv
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.