Otomatik olarak sahip olmanın git submodule update
(veya tercihen git submodule update --init
her git pull
yapı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 --init
her git pull
yapı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.recurse
istenilen davranışı etkinleştirmek için true.
Bunu global olarak şunları yaparak yapabilirsiniz:
git config --global submodule.recurse true
git pull
bir 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 clone
kı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
, pull
vs.), 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 update
anlamda). 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ştirirfetch
vepull
koşulsuz olarak alt modüllere geri döner veya false olarak ayarlandığında hiç geri çekilmez.
on-demand
(Varsayılan değer) olarak ayarlandığındafetch
vepull
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:
git config
man sayfası (1.7.5) (veya son git config
man sayfası )git fetch
man 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 pull
ziyade 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-checkout
ve post-merge
sizin için .git/hooks
bunları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-config
daha 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 .gitconfig
kuruluma sahipseniz (ana ~/.gitconfig
dosyam include
diğer .gitconfig
dosyalara yüklemek için kullanır ) ve komut satırı git
yapı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 .gitconfig
dosyaları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ı?