Git push submodule

128

Jika saya memodifikasi submodule, dapatkah saya mendorong komit kembali ke asal submodule, atau akankah itu memerlukan kloning? Jika clone, dapatkah saya menyimpan clone di dalam repositori lain?

webjay
sumber
4
Dengan git 2.7 (Januari 2016), Anda hanya perlu mengatur satu kali git config push.recurseSubmodules on-demand. Maka sederhana git pushakan cukup untuk mendorong semuanya (repo utama dan submodula). Lihat jawaban saya yang diedit di bawah .
VonC
Harap berikan kode sampel untuk apa yang Anda coba lakukan.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

138

Sebuah submodule hanyalah klon dari repo git di dalam repo lain dengan beberapa data meta tambahan (entri pohon gitlink, file .gitmodules)

$ cd your_submodule
$ git checkout master
<hack,edit>
$ git commit -a -m "commit in submodule"
$ git push
$ cd ..
$ git add your_submodule
$ git commit -m "Updated submodule"
manojlds
sumber
1
Ya, dan jangan lupa untuk menarik perubahan dari cabang lokal Anda yang disinkronkan (jika ada) sebelum mendorong. Terjadi misalnya. ketika bekerja dengan gh-pagescabang untuk dokumentasi pada repo github :)
NiKo
Saya tidak mengerti bagaimana Anda bisa membuat cd your_submodule sebelum menambahkan your_submodule? Saya pikir cara terbaik untuk menambahkan submodule adalah dengan menggunakan perintah "add" git. Jadi, apakah ada cara lain untuk menambahkan submodule?
MrSo
1
@ Mr Jadi saya pikir submodule sudah ada di sana, dia menyerah untuk mengubah sesuatu di submodule.
HattrickNZ
108

Perhatikan bahwa sejak git1.7.11 ( [ANNOUNCE] Git 1.7.11.rc1 dan catatan rilis , Juni 2012) menyebutkan:

" git push --recurse-submodules" belajar secara opsional melihat ke dalam sejarah submodul yang terikat pada superproyek dan mendorongnya keluar.

Mungkin dilakukan setelah tambalan ini dan --on-demandopsi:

recurse-submodules=<check|on-demand>::

Pastikan semua komitmen submodule yang digunakan oleh revisi untuk didorong tersedia di cabang pelacakan jarak jauh.

  • Jika checkdigunakan, itu akan diperiksa bahwa semua submodule melakukan yang diubah dalam revisi yang akan didorong tersedia pada remote.
    Kalau tidak, push akan dibatalkan dan keluar dengan status tidak nol.
  • Jika on-demanddigunakan, semua submodula yang diubah dalam revisi yang akan didorong akan didorong.
    Jika sesuai permintaan tidak dapat mendorong semua revisi yang diperlukan, maka itu juga akan dibatalkan dan keluar dengan status tidak nol.

Jadi, Anda dapat mendorong semuanya sekaligus (dari induk repo) a:

git push --recurse-submodules=on-demand

Opsi ini hanya berfungsi untuk satu tingkat sarang. Perubahan pada submodule di dalam submodule lain tidak akan didorong.


Dengan git 2.7 (Januari 2016), dorongan git sederhana akan cukup untuk mendorong repo induk ... dan semua submodulanya.

Lihat komit d34141c , komit f5c7cd9 (03 Des 2015), komit f5c7cd9 (03 Des 2015), dan komit b33a15b (17 Nov 2015) oleh Mike Crowe ( mikecrowe) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 5d35d72 , 21 Des 2015)

push: tambahkan recurseSubmodulesopsi konfigurasi

The --recurse-submodulesbaris perintah parameter telah ada selama beberapa waktu tetapi tidak memiliki file konfigurasi setara.

Mengikuti gaya parameter yang sesuai untuk git fetch, mari kita adakan push.recurseSubmodulesuntuk menyediakan default untuk parameter ini.
Ini juga membutuhkan penambahan --recurse-submodules=nountuk memungkinkan konfigurasi ditimpa pada baris perintah saat diperlukan.

Cara paling mudah untuk mengimplementasikan ini tampaknya adalah pushmenggunakan kode submodule-configdengan cara yang serupa fetch.

The git configdoc sekarang termasuk :

push.recurseSubmodules:

Pastikan semua komitmen submodule yang digunakan oleh revisi untuk didorong tersedia di cabang pelacak jarak jauh.

  • Jika nilainya adalah ' check', maka Git akan memverifikasi bahwa semua submodule melakukan perubahan pada revisi yang akan didorong tersedia pada setidaknya satu remote submodule. Jika ada komit yang hilang, push akan dibatalkan dan keluar dengan status tidak nol.
  • Jika nilainya adalah ' on-demand' maka semua submodula yang diubah dalam revisi yang akan didorong akan didorong. Jika sesuai permintaan tidak dapat mendorong semua revisi yang diperlukan, maka itu juga akan dibatalkan dan keluar dengan status tidak nol. -
  • Jika nilainya adalah ' no' maka perilaku default mengabaikan submodul saat mendorong dipertahankan.

Anda dapat mengganti konfigurasi ini saat mendorong dengan menentukan ' --recurse-submodules=check|on-demand|no'.

Begitu:

git config push.recurseSubmodules on-demand
git push

Git 2.12 (Q1 2017)

git push --dry-run --recurse-submodules=on-demand akan benar-benar bekerja.

Lihat komit 0301c82 , komit 1aa7365 (17 Nov 2016) oleh Brandon Williams ( mbrandonw) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 12cf113 , 16 Des 2016)

push run with --dry-runtidak benar-benar (Git 2.11 Des. 2016 dan lebih rendah / sebelum) melakukan dry-run ketika push dikonfigurasi untuk mendorong submodules sesuai permintaan.
Sebaliknya semua submodules yang perlu didorong sebenarnya didorong ke remote mereka sementara setiap pembaruan untuk proyek super dilakukan sebagai dry-run.
Ini adalah bug dan bukan perilaku yang diinginkan dari dry-run.

Ajari pushuntuk menghormati --dry-runopsi ketika dikonfigurasikan untuk secara push mendorong submodul 'on-demand'.
Ini dilakukan dengan mengedarkan --dry-runflag ke proses anak yang melakukan push untuk submodules saat melakukan dry-run.


Dan masih di Git 2.12, Anda sekarang memiliki --recurse-submodules=onlyopsi " " untuk mendorong submodula keluar tanpa mendorong proyek tingkat atas .

Lihat komit 225e8bf , komit 6c656c3 , komit 14c01bd (19 Des 2016) oleh Brandon Williams ( mbrandonw) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 792e22e , 31 Jan 2017)

VONC
sumber
Ini tersedia sekarang bukan?
CMCDragonkai
@ CMCDragonkai ya, Anda bisa melihatnya di git-scm.com/docs/git-push . Saya telah mengedit jawabannya.
VonC
Apakah ada komitmen rekursif?
CMCDragonkai
1
Anda selalu dapat melakukan 'git submodule foreach commit'
reflog
Saya harus memperbarui file .gitmodules saya dengan url bitbucket.
wclark