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?
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?
Yanıtlar:
İ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
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ı
git config --global submodule.recurse true
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 :-(
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.
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'
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ştirirfetchvepullkoşulsuz olarak alt modüllere geri döner veya false olarak ayarlandığında hiç geri çekilmez.
on-demand(Varsayılan değer) olarak ayarlandığındafetchvepullyalnı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:
git configman sayfası (1.7.5) (veya son git configman sayfası )git fetchman sayfası (1.7.5) (veya en son git man sayfasını getir )daha fazla bilgi için.
git fetch --recurse-submodules[=yes|on-demand|no]
git fetch, bir değil git submodule update.
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.
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.
core.hooksPath , git-configdaha fazla ayrıntı için belgelere bakın.
git pull --rebase:(
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
}
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
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ı?