Perbarui submodule ke komit terbaru

269

Saya memiliki proyek A yang merupakan perpustakaan dan digunakan dalam proyek B.

Kedua proyek A dan B memiliki repositori terpisah di github TETAPI di dalam B kami memiliki submodul A.

Saya mengedit beberapa kelas di perpustakaan, yang ada di repo A, saya mendorong repo jarak jauh, sehingga perpustakaan (repo A) diperbarui.

Pembaruan ini tidak mencerminkan "referensi" (submodule) yang merujuk pada komit sebelumnya .... apa yang harus saya lakukan untuk memperbarui submodule on git?

lemak
sumber

Jawaban:

358

Masukkan direktori submodule:

cd projB/projA

Tarik repo dari proyek A Anda ( tidak akan memperbarui status git orang tua Anda, proyek B):

git pull origin master

Kembali ke direktori root & periksa pembaruan:

cd ..
git status

Jika submodule diperbarui sebelumnya, itu akan menunjukkan sesuatu seperti di bawah ini:

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#

Kemudian, lakukan pembaruan:

git add projB/projA
git commit -m "projA submodule updated"

MEMPERBARUI

Seperti @paul tunjukkan, karena git 1.8, kita bisa menggunakan

git submodule update --remote --merge

untuk memperbarui submodule ke komit jarak jauh terbaru. Akan lebih mudah dalam banyak kasus.

Kjuly
sumber
35
BTW, jika Anda bukan pemilik submodule, Anda bisa melakukannya git submodule updateketika orang lain memperbarui projA (Anda akan mendapatkan id komit baru).
Kjuly
Saya memiliki repo utama submodule (proj A) tetapi saya seorang committer di proj B.
fat
@ Juli Setelah komit, bagaimana cara mendorongnya ke remote? Apakah ini adil git push?
KR29
1
@ KR29 benar, dan cmd penuh adalah git push <remote> <branch>, mis git push origin dev.
Kjuly
2
git submodule updatehanya bekerja tanpa tanda ketika komit telah ditarik (dalam B) untuk pembaruan referensi ke submodule (s) yang bersangkutan (proj A). Untuk memperbarui proj B untuk referensi HEADcabang pelacakan jarak jauh untuk proj A, Anda harus melakukan git submodule update --remote --mergeseperti yang ditunjukkan dalam jawaban Paul Hatcher di bawah ini.
Ben Burns
109

Karena git 1.8 dapat Anda lakukan

git submodule update --remote --merge

Ini akan memperbarui submodule ke komit jarak jauh terbaru. Anda kemudian perlu melakukan perubahan sehingga gitlink dalam repositori induk diperbarui

git commit

Dan kemudian dorong perubahan karena tanpa ini, identitas SHA-1 yang menunjuk ke submodule tidak akan diperbarui dan sehingga perubahan tidak akan terlihat oleh orang lain.

Paul Hatcher
sumber
Meskipun saya lakukan git commitsemua orang masih tidak melihatnya. On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: modified: SubmoduleA (new commits) modified: SubmoduleB (new commits)
Max N
1
Sudahkah Anda melakukan "git push" setelah komit Anda, ingat komit hanya mengubah repositori lokal Anda, Anda harus mendorongnya ke remote agar semua orang dapat melihatnya
Paul Hatcher
Hilang dari jawaban ini (tetapi dicatat dalam jawaban lain di bawah): submodule yang diperbarui harus dipentaskan git addsebelum melakukan.
joshng
1
@ joshng Saya merasa bahwa semua orang yang berada pada titik di mana mereka mengerjakan submodules akan mengerti itu. Ini adalah satu-satunya posting yang membantu saya, terima kasih banyak.
Husk Rekoms
38

Jika Anda memperbarui submodule dan berkomitmen untuk itu, Anda harus pergi ke repo yang berisi, atau lebih tinggi dan menambahkan perubahan di sana.

git status

akan menampilkan sesuatu seperti:

modified:
   some/path/to/your/submodule

Fakta bahwa submodule tidak sinkron juga dapat dilihat

git submodule

output akan menunjukkan:

+afafaffa232452362634243523 some/path/to/your/submodule

Nilai tambah menunjukkan bahwa submodule Anda menunjuk ke depan di mana repo top mengharapkannya.

cukup tambahkan perubahan ini:

git add some/path/to/your/submodule

dan lakukan itu:

git commit -m "referenced newer version of my submodule"

Ketika Anda mendorong perubahan Anda, pastikan Anda mendorong perubahan di submodule terlebih dahulu dan kemudian mendorong perubahan referensi di repo luar. Dengan cara ini orang yang memperbarui akan selalu dapat berjalan dengan sukses

git submodule update

Info lebih lanjut tentang submodula dapat ditemukan di sini http://progit.org/book/ch6-6.html .

Adam Dymitruk
sumber
Jika Anda tidak melihat +ketika Anda menjalankan git submodule, pastikan Anda menginisialisasi dan mengimpor submodul. Perintah untuk itu adalah git submodule initdan git submodule update, masing-masing.
fureigh
19

Versi baris tunggal

git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"
Andy Webov
sumber
2

Beberapa jawaban lain merekomendasikan penggabungan / komit dalam direktori submodule, yang IMO dapat menjadi sedikit berantakan.

Dengan asumsi server remote dinamai origindan kami ingin mastercabang submodule (s), saya cenderung menggunakan:

git submodule foreach "git fetch && git reset --hard origin/master"

Catatan: Ini akan melakukan hard reset pada setiap submodule - jika Anda tidak ingin ini, Anda dapat mengubah --hardke --soft.

Kesederhanaan Xtra
sumber
1

Proyek saya harus menggunakan 'terbaru' untuk submodule. Di Mac OSX 10.11, git versi 2.7.1, saya tidak perlu 'masuk' ke folder submodule saya untuk mengumpulkan komitnya. Saya hanya melakukan rutin

git pull --rebase 

di tingkat atas, dan itu benar memperbarui submodule saya.

AnneTheAgile
sumber
0

Tanggapan Andy berhasil bagi saya dengan keluar dari $ path:

git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"
Miguel Fernandes Muldy
sumber
Kemungkinan alasan mengapa jawaban @Andy Webov tidak mengharuskan untuk melarikan diri adalah karena mereka menggunakan tanda kutip tunggal di sekitar path, misalnya. '$path'
S0AndS0