Apakah ada cara untuk secara otomatis git submodule update(atau lebih baik git submodule update --initmenelepon kapan pun git pulldilakukan?
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 --initmenelepon kapan pun git pulldilakukan?
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.recursetrue untuk mengaktifkan perilaku yang diinginkan.
Anda dapat melakukan ini secara global dengan menjalankan:
git config --global submodule.recurse true
git pulljuga mengambil submodule dan dijalankan submodule update. Ini benar-benar perlu menjadi jawaban yang diterima sekarang
git config --global submodule.recurse true
git clonejuga. 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 updatearti). 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 perilakufetchdanpulluntuk 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),fetchdanpullhanya akan muncul kembali ke submodule yang terisi ketika superprojectnya mengambil komit yang memperbarui referensi submodule .
Lihat:
git confighalaman manual (1.7.5) (atau git confighalaman manual terbaru )git fetchhalaman 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 updatemasih perlu, seperti dicatat oleh @ Art.
Saya terkejut tidak ada yang disebutkan menggunakan kait git untuk melakukan ini!
Cukup tambahkan file yang dinamai post-checkoutdan post-mergeke .git/hooksdirektori 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/hooksuntuk Anda.
core.hooksPathuntuk direktori hooks , lihat dokumen untuk git-configdetail 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( ~/.gitconfigfile utama saya digunakan includeuntuk memuat dalam .gitconfigfile lain ), dan Anda tidak pernah ingat bagaimana mengkonversi antara gitformat konfigurasi command-line dan .gitconfigformat, berikut ini cara menambahkannya ke salah satu .gitconfigfile 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?