Apakah ada cara untuk secara otomatis git submodule update
(atau lebih baik git submodule update --init
menelepon kapan pun git pull
dilakukan?
Mencari pengaturan git config, atau alias git untuk membantu masalah ini.
Apakah ada cara untuk secara otomatis git submodule update
(atau lebih baik git submodule update --init
menelepon kapan pun git pull
dilakukan?
Mencari pengaturan git config, atau alias git untuk membantu masalah ini.
Jawaban:
Pada Git 2.14 , Anda dapat menggunakan git pull --recurse-submodules
(dan memberikannya sesuai keinginan Anda).
Pada Git 2.15 , Anda bisa mengatur submodule.recurse
true untuk mengaktifkan perilaku yang diinginkan.
Anda dapat melakukan ini secara global dengan menjalankan:
git config --global submodule.recurse true
git pull
juga mengambil submodule dan dijalankan submodule update
. Ini benar-benar perlu menjadi jawaban yang diterima sekarang
git config --global submodule.recurse true
git clone
juga. Dan aktifkan secara default. Kalau tidak, akan selalu ada hambatan besar untuk menggunakan submodula, karena modul orang selalu keluar dari sinkronisasi :-(
commit
, fetch
, pull
, dll) dirancang untuk hanya diterapkan pada repositori saat ini. submodule adalah repositori lain dan tidak boleh terpengaruh oleh perintah yang dijalankan di repositori induk secara default. ini adalah semacam keputusan desain oleh git-developer.
git config --global alias.pullall '!git pull && git submodule update --init --recursive'
Jika Anda ingin argumen dilewatkan ke git pull, gunakan ini sebagai gantinya:
git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'
Dimulai dengan Git 1.7.5 seharusnya memperbarui submodules secara otomatis seperti yang Anda inginkan.
[EDIT: per komentar: the 1.7.5 perilaku baru adalah untuk secara otomatis mengambil komit terbaru untuk submodul, tapi tidak untuk memperbarui mereka (dalam git submodule update
arti). Jadi informasi dalam jawaban ini relevan sebagai latar belakang, tetapi bukan jawaban yang lengkap dengan sendirinya. Anda masih membutuhkan alias untuk menarik dan memperbarui submodul dalam satu perintah.]
Perilaku default, "sesuai permintaan", adalah memperbarui submodules setiap kali Anda mengambil komit yang memperbarui komit submodule, dan komit ini belum terletak di klon lokal Anda.
Anda juga dapat memperbaruinya pada setiap pengambilan atau tidak pernah sama sekali (pra-1.7.5 perilaku saya asumsikan).
Opsi konfigurasi untuk mengubah perilaku ini adalah fetch.recurseSubmodules
.
Opsi ini dapat diatur ke nilai boolean atau ke
on-demand
.
Menyetelnya ke boolean mengubah perilakufetch
danpull
untuk berulang tanpa syarat menjadi submodul bila disetel ke true atau tidak berulang sama sekali bila disetel ke false.Ketika diatur ke
on-demand
(nilai default),fetch
danpull
hanya akan muncul kembali ke submodule yang terisi ketika superprojectnya mengambil komit yang memperbarui referensi submodule .
Lihat:
git config
halaman manual (1.7.5) (atau git config
halaman manual terbaru )git fetch
halaman manual (1.7.5) (atau halaman manual git fetch terbaru )untuk informasi lebih lanjut.
git fetch --recurse-submodules[=yes|on-demand|no]
git fetch
, bukan a git submodule update
.
git pull
, alih-alih git fetch
, opsi ini hanya membuat pengambilan rekursif. Itu tidak akan mengubah komit apa yang diperiksa dalam submodul sama sekali. Jadi git submodule update
masih perlu, seperti dicatat oleh @ Art.
Saya terkejut tidak ada yang disebutkan menggunakan kait git untuk melakukan ini!
Cukup tambahkan file yang dinamai post-checkout
dan post-merge
ke .git/hooks
direktori Anda dari repositori yang relevan, dan masukkan yang berikut ke masing-masingnya:
#!/bin/sh
git submodule update --init --recursive
Karena Anda secara khusus meminta alias, dengan asumsi Anda ingin memiliki ini untuk banyak repositori, Anda dapat membuat alias yang menambahkan ini ke repositori .git/hooks
untuk Anda.
core.hooksPath
untuk direktori hooks , lihat dokumen untuk git-config
detail lebih lanjut.
git pull --rebase
:(
Anda dapat membuat alias untuk perintah git yang secara otomatis menangani pembaruan submodule. Tambahkan berikut ini ke .bashrc Anda
# 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
}
Seperti yang disebutkan orang lain, Anda dapat dengan mudah mengatur ini dengan:
git config --global submodule.recurse true
Namun, jika Anda seperti saya dan memiliki pengaturan yang lebih kompleks .gitconfig
( ~/.gitconfig
file utama saya digunakan include
untuk memuat dalam .gitconfig
file lain ), dan Anda tidak pernah ingat bagaimana mengkonversi antara git
format konfigurasi command-line dan .gitconfig
format, berikut ini cara menambahkannya ke salah satu .gitconfig
file Anda :
[submodule]
recurse = true
Hanya cara saya bisa mendapatkan submodules dan submodules bersarang untuk memperbarui:
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;
Saya kesulitan menciptakan alias melalui terminal karena tanda kurung jadi saya harus menambahkan ini secara manual ke .gitconfig untuk global:
[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;"
Adakah saran untuk cara menjalankan perintah atau alias secara otomatis?