Git memperbarui submodules secara rekursif

284

Struture proyek saya

ProjectA
-FrameworkA (submodule)
--Twig (submodule of FrameworkA)

Bagaimana saya dapat memperbarui submodul secara rekursif? Saya sudah mencoba beberapa perintah git (pada root ProjectA)

git submodule foreach git pull origin master

atau

git submodule foreach --recursive git pull origin master

tetapi tidak dapat menarik file Ranting.

complez
sumber
Bagaimana dengan kedalaman git ?
Mathew Kurian

Jawaban:

610
git submodule update --recursive

Anda mungkin juga ingin menggunakan opsi --init yang akan membuatnya menginisialisasi setiap submodul yang tidak diinisialisasi:

git submodule update --init --recursive

Catatan: di beberapa versi Git yang lebih lama , jika Anda menggunakan --initopsi, submodule yang sudah diinisialisasi mungkin tidak diperbarui. Dalam hal ini, Anda juga harus menjalankan perintah tanpa --initopsi.

drewag
sumber
1
Bagaimana kalau menambahkan submodule secara rekursif? "git submodule add FrameworkA.git" cukup tarik file dari FrameworkA.
complez
2
Anda bisa melakukan "git submodule add blah" dan kemudian "git submodule update --init --recursive".
drewag
Apakah ini berbeda dengan cara saya di bawah ini?
William Entriken
3
@Irineau Catatan tentang submodule yang sudah diinisialisasi tidak diperbarui jika --initdigunakan tidak sesuai dengan pengalaman saya di Git 2.2.2. Saya melihat kedua submodul tingkat atas dan bersarang yang telah diinisialisasi mendapatkan komit yang benar diperiksa ketika saya gunakan git submodule update --init --recursive, dan saya pikir klaim bahwa Anda perlu menjalankan perintah dengan dan tanpa --inititu salah. Kecuali seseorang dapat menunjukkan bukti bahwa ini adalah perilaku atau menunjukkan bahwa itu berubah di antara versi dan dulunya benar, saya berencana untuk mengeditnya sama sekali.
Mark Amery
3
@MarkAmery, saya ingat ini menjadi masalah di beberapa versi git yang tidak bisa saya ingat. Saya baru saja mengujinya di 1.9.3 dan masalahnya sepertinya tidak ada lagi. Saya memperbarui jawaban untuk merujuk ke "versi lama" yang tidak jelas. Jika ada yang bisa menentukan versi mana yang mengubah perilaku ini, itu akan bagus.
drewag
35

Cara saya menggunakan adalah:

git submodule update --init --recursive
git submodule foreach --recursive git fetch
git submodule foreach git merge origin master
William Entriken
sumber
6
Saya bekerja dengan mengubah baris terakhir ke:git submodule foreach git pull --ff-only origin master
Gilad Peleg
2
Saya juga akan menambahkan --recursive ke baris terakhir: "git submodule foreach - git master gabung penggabungan asal" jika tidak, Anda bisa mendapatkan submodule kotor ketika itu sendiri telah memperbarui submodule.
Michael Scott Cuthbert
Sudah mencari ini selama tiga jam terakhir. Terima kasih Pak. Untuk menambah ini, Anda juga dapat menggunakan perintah ini untuk melakukan, seperti: git submodule foreach --recursive 'git commit -a | :'. Itu :membuatnya loop terlepas dari hasil. Lihat tautan stackoverflow.com/questions/19728933/… .
Fledgling Pidgeon
17

Seperti yang mungkin terjadi bahwa cabang default dari submodules Anda tidak master (yang sering terjadi dalam kasus saya), ini adalah bagaimana saya mengotomatiskan upgrade submodules Git lengkap:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'
Sebastien Varrette
sumber
Saya mencoba untuk menambahkan perintah ini dalam Makefile generik saya namun saya masih terhenti untuk membuat GNU Make abaikan interpretasi dari urutan $ (...), meskipun ada dalam tanda kutip sederhana. Adakah yang punya ide?
Sebastien Varrette
Perintah Anda adalah apa yang saya butuhkan terima kasih! Tapi saya mendapatkan: di Entering 'Core' fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.mana Core submodule
Sanandrea
Juga, saya kira Anda perlu mencari tahu komentar ini stackoverflow.com/a/18008139/3383543
Ahmad AlMughrabi
tidak memiliki opsi rekursif berarti ini hanya berfungsi jika submodul Anda tidak menyertakan submodul lagi.
erikbwork
15

Dalam Git baru-baru ini (saya menggunakan v2.15.1), yang berikut ini akan menggabungkan perubahan submodul hulu ke dalam submodul secara rekursif:

git submodule update --recursive --remote --merge

Anda dapat menambahkan --inituntuk menginisialisasi submodules yang tidak diinisialisasi dan digunakan --rebasejika Anda ingin rebase alih-alih bergabung.

Anda harus melakukan perubahan setelahnya:

git add . && git commit -m 'Update submodules to latest revisions'
Tuan
sumber
Ini, saya pikir saya melakukan sesuatu yang salah tetapi jawaban Anda mengonfirmasi kepada saya bahwa itu git submodule update --remote my-dir/my-submoduleberfungsi dengan baik
iomv