Perbedaan antara git submodule dan subtree

300

Apa perbedaan konseptual antara menggunakan submitule git dan subtree?

Apa skenario khas untuk masing-masing?

Nathan H
sumber
3
Ini mungkin tidak menjawab semua pertanyaan Anda tetapi bacaan yang menarik tentang masalah ini: blogs.atlassian.com/2013/05/…
Chop
Pertanyaan serupa adalah stackoverflow.com/questions/571232/…
Michael Freidgeim
"Alternatif untuk Git submodul?": Stackoverflow.com/questions/6500524/...
brillout

Jawaban:

177

Bagaimana jika saya ingin tautannya selalu mengarah ke KEPALA repo eksternal?

Anda dapat membuat submodule untuk mengikuti KEPALA cabang dari repo remote submodule, dengan:

o git submodule add -b <branch> <repository> [<path>]. (untuk menentukan cabang yang akan diikuti)
o git submodule update --remoteyang akan memperbarui konten submodule ke HEAD terbaru dari <repository>/<branch>, secara default origin/master. Proyek utama Anda masih akan melacak hash KEPALA submodule bahkan jika --remotedigunakan sekalipun.


VONC
sumber
jawaban Anda tampaknya bertentangan dengan jawaban yang dipilih di sini: stackoverflow.com/questions/10443627/...
Nathan H
@NathanH ini (kemungkinan untuk melacak HEAD) telah ditambahkan setahun kemudian (Maret 2013, git 1.8.2: github.com/git/git/blob/… )
VonC
Saya melihat perilaku tindak lanjut submodule juga disebutkan dalam jawaban Anda yang lain . Dalam hal ini saya pikir Anda bermaksud mengatakan bahwa selalu menunjuk ke KEPALA submodule dilakukan dengan menggunakan keduanya add -bdan --remotekemudian pada perintah pembaruan, sesuai dengan dokumentasi pembaruan submodule . Dalam hal itu, apakah -bbenar - benar masih diperlukan untuk mengikuti KEPALA master?
matanster
@matt -bdigunakan untuk menghasilkan metadata .gitmodule yang tepat untuk submodule (setara dengan a git config -f .gitmodules submodule.<path>.branch <branch>).
VonC
Maka itu tidak ada hubungannya dengan mengaktifkan --remote- --remoteberfungsi juga jika -bbelum digunakan add. Dalam kedua kasus pembaruan akan menyebabkan komit di induk repo menampung submodule, sehingga tautan tidak benar-benar "selalu menunjuk ke KEPALA" dengan cara yang sangat otomatis .... baik saya tidak mendapatkannya, atau klaim itu lebih baik dihapus dari jawaban asli (?)
matanster
351

submodule adalah tautan;

subtree adalah salinan

Feng
sumber
121

Perbedaan konseptual adalah:

Dengan git submodules Anda biasanya ingin memisahkan repositori besar menjadi yang lebih kecil. Cara mereferensikan submodule adalah gaya-maven - Anda mereferensikan komit tunggal dari repositori (submodule) lain. Jika Anda memerlukan perubahan di dalam submodule Anda harus membuat komit / dorongan dalam submodule, kemudian referensi komit baru di repositori utama dan kemudian komit / tekan referensi yang diubah dari repositori utama. Dengan begitu Anda harus memiliki akses ke kedua repositori untuk bangunan lengkap.

Dengan git subtree Anda mengintegrasikan repositori lain ke dalam milik Anda, termasuk riwayatnya. Jadi setelah mengintegrasikannya, ukuran repositori Anda mungkin lebih besar (jadi ini bukan strategi untuk menjaga repositori lebih kecil). Setelah integrasi, tidak ada koneksi ke repositori lain, dan Anda tidak perlu mengaksesnya kecuali Anda ingin mendapatkan pembaruan. Jadi strategi ini lebih untuk penggunaan ulang kode dan riwayat - Saya pribadi tidak menggunakannya.

Niklas P
sumber
Tetapi dengan git subtreeAnda masih bisa mendorong - jika Anda mau - kan?
Ixx
@ lxx Jika Anda tahu URL repositori ...
Franklin Yu
@ FranklinYu Kenapa dia tidak tahu itu? tidak bisa mendapatkan info itu dari data meta git lokal?
adi518
@ adi518 Ya, jika Anda yang membuat subtree. Namun, jika Anda mendorong repositori Anda ke GitHub dan yang lainnya mengkloningnya ke bawah, saya rasa ia tidak secara otomatis mengetahui URL subtree.
Franklin Yu
@NiklasP - dapatkah Anda menguraikan "referensi komit baru di repositori utama"? Itulah satu langkah yang saya tidak jelas tentang bagaimana mengeksekusi dan oleh karena itu "referensi yang diubah" juga bukan sesuatu yang saya mengerti.
Robert Oschler
21

sub-modul yang
mendorong repo utama ke remote tidak mendorong file sub-modul

sub-tree
mendorong repo utama ke remote mendorong file sub-tree

Maciek Rek
sumber
3
"Mendorong repo utama ke remote mendorong file sub-pohon" Tidak, tidak.
J Bramble
@JBramble Saya mungkin harus menyebutkan bahwa itu dilakukan dengan aplikasi SourceTree misalnya:git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
Maciek Rek