Git pull alt modüllerini otomatik olarak güncellemenin bir yolu var mı?


203

Otomatik olarak sahip olmanın git submodule update(veya tercihen git submodule update --inither git pullyapıldığında çağrılmanın) bir yolu var mı?

Buna yardımcı olması için bir git config ayarı veya bir git takma adı mı arıyorsunuz?



1
Git takma adı neden kabuk takma adı tercih edilir?
wnoise

20
git takma adları güzeldir, çünkü komutu "git" ad alanında içerir. Tüm git komutlarının neden kendi adlarına sahip olmak yerine neden "git" ile başladığını sorabilirsiniz.
Lily Ballard

5
Bunu bulan herkes için, yüksek oy kullanan cevaplar şu anda güncel değil. Kane'nin cevabı doğrudur: stackoverflow.com/a/49427199/3499424
John Neuhaus

Yanıtlar:


176

İtibariyle Git 2.14 kullanabileceğiniz git pull --recurse-submodules(o ne istersen ve takma ad).

İtibariyle Git 2.15 , sen ayarlayabilirsiniz submodule.recurseistenilen davranışı etkinleştirmek için true.

Bunu global olarak şunları yaparak yapabilirsiniz:

git config --global submodule.recurse true

3
2.16 ile onaylandığında, bunu true olarak ayarlamak git pullbir alt modülün getirilmesine ve çalıştırılmasına neden olur submodule update. Bu gerçekten kabul edilmiş bir cevap olmalı
John Neuhaus

1
Bunu küresel olarak ayarlamak için:git config --global submodule.recurse true
wintersolutions

14
Alt modüller tarafından hayal kırıklığına uğradım, sonra bunu yaptım. Şimdi beklediğim gibi çalışıyorlar. Bunun varsayılan davranış olmadığını düşünmememin bir nedeni var mı?
Ben

9
Bunu da mümkün git clonekılmalılar. Ve varsayılan olarak açın. Aksi takdirde, insanların modülleri her zaman senkronize olmadığından alt modüllerin kullanılmasına her zaman büyük bir direnç olacaktır :-(
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli新疆改造中心法轮功六四事件Santilli git komutları (gibi commit, fetch, pullvs.), yalnızca geçerli depo uygulanabilir şekilde tasarlanmıştır. bir alt modül başka bir havuzdur ve varsayılan olarak üst depoda yürütülen komutlardan etkilenmemelidir. bu git-geliştiricinin bir tür tasarım kararıdır.
anyon

113

git config --global alias.pullall '!git pull && git submodule update --init --recursive'

Değişkenlerin git pull'a iletilmesini istiyorsanız, bunun yerine şunu kullanın:

git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'

4
Kullandığınız tüm git depolarında bu takma adı istiyorsanız "git config --global" kullanmayı unutmayın
yoyo

43

Git 1.7.5 ile başlayarak alt modülleri varsayılan olarak istediğiniz gibi otomatik olarak güncellemelidir.

[DÜZENLEME: Yorumlar başı: Yeni 1.7.5 davranışı otomatik etmektir getirme submodüller son kaydedilmesini, ancak değil için güncelleme onları (içinde git submodule updateanlamda). Dolayısıyla bu cevaptaki bilgiler arka planla ilgilidir, ancak kendi başına tam bir cevap değildir. Alt modülleri tek bir komutta almak ve güncellemek için yine de bir takma ada ihtiyacınız var.]

Varsayılan davranış olan "isteğe bağlı", alt modül taahhüdünü güncelleyen bir taahhüt getirdiğinizde alt modülleri güncellemektir ve bu taahhüt yerel klonunuzda zaten bulunmaz.
Ayrıca her getiride güncellenmiş olabilir veya hiç (1.7.5 öncesi davranış) varsayıyorum.
Bu davranışı değiştirmek için yapılandırma seçeneği fetch.recurseSubmodules.

Bu seçenek bir boole değerine veya olarak ayarlanabilir on-demand.
Bir boole değerine ayarlamak, true olarak ayarlandığında davranışı değiştirir fetchve pullkoşulsuz olarak alt modüllere geri döner veya false olarak ayarlandığında hiç geri çekilmez.

on-demand(Varsayılan değer) olarak ayarlandığında fetchve pull yalnızca üst projesinin alt modülün başvurusunu güncelleyen bir taahhüt aldığında doldurulmuş bir alt modüle geri çekilir .

Görmek:

daha fazla bilgi için.

git fetch --recurse-submodules[=yes|on-demand|no]

27
Dikkat edin: Aşağıdaki cevapların açıkladığı gibi, bu sadece değişiklikleri otomatik olarak getirir, yine de bir alt modül güncellemesi yapmanız gerekir - bu yüzden takma ad doğru.
Artem

4
@Artem doğru. Bu cevap yararlı olsa da tüm soruyu ele almıyor. Bu ayar sadece gerçekleştirir git fetch, bir değil git submodule update.
Andrew Ferrier

2
Bu cevap son derece aldatıcı. Hatta birlikte kullanıldığında git pullziyade git fetch, bu seçenek yalnızca kılan getiriliyor özyinelemeli. Alt modüllerde hangi taahhüdün kontrol edildiğini hiç değiştirmez. Bu yüzden git submodule update@Artem tarafından belirtildiği gibi hala gereklidir.
Mark Amery

31

Kimse bunu yapmak için git kanca kullanarak bahsetti şaşırdım!

Sadece adlandırılmış dosyaları eklemek post-checkoutve post-mergesizin için .git/hooksbunların her birine ilgili havuzlarından dizine ve aşağıdakileri koyun:

#!/bin/sh
git submodule update --init --recursive

Özel olarak bir takma ad istediğinden, bunu birçok depo için kullanmak istediğinizi varsayarsak, bunları sizin için bir depoya ekleyen bir takma ad oluşturabilirsiniz .git/hooks.


2
Bunu küresel bir ortam haline getirmenin bir yolu var mı? Ya da depoyu kontrol ederken otomatik olarak alacağınız?
Raoul Steffen

3
Git'in son sürümü olan 2.9, bir kanca dizini için bir ayar ekledicore.hooksPath , git-configdaha fazla ayrıntı için belgelere bakın.
taleinat

1
Check-out sırasında otomatik olarak alınan bir şey gelince, ben aradım ama tür bir şey bulamadım. Bir kaynak, bunun istemci bilgisayarlarda rasgele kod çalıştırmak için kolayca kullanılabileceğinden, güvenlik sorunları için bilerek desteklenmediğini belirtti.
taleinat

1
Bunun bir güvenlik sorunu olabileceğini görüyorum. Ne de olsa, ben çalışma arkadaşlarımın bilgisayarlarında onlara talimat vermek zorunda kalmadan kod I program çalıştırmak için kullanmak istiyorum.
Raoul Steffen

1
Bu çözüm ilk düşüncemdi, ama sonra bunu kullanan insanları kapsamadığını fark ettim git pull --rebase:(
Vaz

8

Kevin Ballard'ın önerdiği bir takma ad, mükemmel bir çözümdür. Sadece başka bir seçeneği atmak için, sadece çalışan bir birleştirme sonrası kanca da kullanabilirsiniz git submodule update [--init].


7

Alt modül güncellemesini otomatik olarak işleyen git komutu için bir takma ad oluşturabilirsiniz. Aşağıdakileri .bashrc'nize ekleyin

# make git submodules usable
#   This overwrites the 'git' command with modifications where necessary, and
#   calls the original otherwise
git() {
    if [[ $@ == clone* ]]; then
        gitargs=$(echo "$@" | cut -c6-)
        command git clone --recursive $gitargs
    elif [[ $@ == pull* ]]; then
        command git "$@" && git submodule update --init --recursive
    elif [[ $@ == checkout* ]]; then
        command git "$@" && git submodule update --init --recursive
    else
        command git "$@"
    fi
}

1
Git için bir takma ad yerine, takma ad komutunu kullanarak veya yolunuzda git- (git-
bettermodule

7

Diğerlerinin de belirttiği gibi, bunu kolayca aşağıdakilerle ayarlayabilirsiniz:

git config --global submodule.recurse true

Ancak, benden hoşlanıyorsanız ve daha karmaşık bir .gitconfigkuruluma sahipseniz (ana ~/.gitconfigdosyam includediğer .gitconfigdosyalara yüklemek için kullanır ) ve komut satırı gityapılandırma biçimi ile biçim arasında nasıl dönüştürüleceğini asla hatırlayamıyorsanız .gitconfig, nasıl ekleyeceğiniz aşağıda açıklanmıştır .gitconfigdosyalarınızdan herhangi birine :

[submodule]
  recurse = true

0

Tek şekilde nasıl güncellemek için alt modülleri ve iç içe alt modülleri elde edebildi:

git submodule update --remote --merge --recursive; git submodule foreach --recursive "(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);" git add .; git commit -m 'SubmodulesSynced'; git push; git pull;

Parantez nedeniyle terminal aracılığıyla takma ad oluşturmak için mücadele ediyordum, bu yüzden bunu global için .gitconfig'e eklemek zorunda kaldım:

[alias] supdate = "!git submodule update --remote --merge --recursive; git submodule foreach --recursive '(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);' git add .; git commit -m 'SubmodulesSynced'; git push; git pull;"

Komutların veya diğer adın otomatik olarak nasıl çalıştırılacağı konusunda herhangi bir öneriniz var mı?

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.