Apakah ada cara untuk membuat git pull secara otomatis memperbarui submodules?


203

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.



1
Mengapa alias git lebih disukai daripada alias shell?
Berkumandang

20
alias git bagus karena merangkum perintah di namespace "git". Anda mungkin juga bertanya mengapa semua perintah git dimulai dengan "git" alih-alih memiliki nama mereka sendiri.
Lily Ballard

5
Bagi siapa pun yang menemukan ini, jawaban dengan suara tinggi saat ini kedaluwarsa. Jawaban Kane akurat: stackoverflow.com/a/49427199/3499424
John Neuhaus

Jawaban:


176

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

3
Dikonfirmasi dengan 2.16, menyetel ini ke true akan menyebabkan git pulljuga mengambil submodule dan dijalankan submodule update. Ini benar-benar perlu menjadi jawaban yang diterima sekarang
John Neuhaus

1
Untuk mengatur ini secara global:git config --global submodule.recurse true
musim dingin

14
Saya frustrasi oleh submodules, lalu saya melakukan ini. Sekarang mereka bekerja seperti yang saya harapkan. Apakah ada alasan saya tidak berpikir bahwa ini bukan perilaku default?
Ben

9
Mereka harus mengaktifkannya git clonejuga. Dan aktifkan secara default. Kalau tidak, akan selalu ada hambatan besar untuk menggunakan submodula, karena modul orang selalu keluar dari sinkronisasi :-(
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功 法轮功

1
@CiroSantilli新疆改造中心法轮功六四事件Santilli git perintah (seperti 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.
anion

113

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'

4
jangan lupa untuk menggunakan "git config --global" jika Anda ingin alias ini di semua repositori git yang Anda gunakan
yoyo

43

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 perilaku fetchdan pulluntuk 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), fetchdan pull hanya akan muncul kembali ke submodule yang terisi ketika superprojectnya mengambil komit yang memperbarui referensi submodule .

Lihat:

untuk informasi lebih lanjut.

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

27
Hati-hati: seperti jawaban di bawah ini menjelaskan, ini hanya mengambil perubahan secara otomatis, Anda masih harus melakukan pembaruan submodule - jadi alias jawabannya benar.
Artem

4
@ Art sudah benar. Jawaban ini, meskipun bermanfaat, tidak menjawab seluruh pertanyaan. Pengaturan ini hanya menjalankan a git fetch, bukan a git submodule update.
Andrew Ferrier

2
Jawaban ini sangat menipu. Bahkan ketika digunakan dengan 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.
Mark Amery

31

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.


2
Apakah ada cara untuk menjadikan ini pengaturan global? Atau yang Anda dapatkan secara otomatis saat memeriksa repositori?
Raoul Steffen

3
Rilis terbaru git, 2.9, telah menambahkan pengaturan bernama core.hooksPathuntuk direktori hooks , lihat dokumen untuk git-configdetail lebih lanjut.
taleinat

1
Adapun sesuatu yang diterima secara otomatis ketika check out, saya mencari tetapi tidak dapat menemukan hal semacam itu. Salah satu sumber menyebutkan bahwa ini sengaja tidak didukung untuk masalah keamanan, karena ini bisa lebih mudah digunakan untuk menjalankan kode arbitrer pada mesin klien.
taleinat

1
Saya melihat bagaimana itu bisa menjadi masalah keamanan. Lagi pula, saya ingin menggunakannya untuk menjalankan program kode I di komputer rekan kerja saya tanpa harus menginstruksikannya.
Raoul Steffen

1
Solusi ini adalah pikiran pertama saya, tetapi kemudian saya menyadari bahwa itu tidak akan mencakup orang-orang yang menggunakan git pull --rebase:(
Vaz

8

Sebuah alias, seperti yang disarankan oleh Kevin Ballard, adalah solusi yang sangat bagus. Hanya untuk melemparkan opsi lain di luar sana, Anda juga bisa menggunakan post-merge hook yang hanya berjalan git submodule update [--init].


7

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
}

1
Alih-alih alias untuk git, Anda dapat menambahkan alias ke git melalui perintah alias atau dengan membuat perintah di jalur Anda yang dimulai dengan git- (git-bettermodule)
idbrii

7

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

0

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?

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.