Git submodule vs Git clone

18

Saya sedang mengerjakan proyek open source di GitHub.

Ini memiliki subdirektori / Vendor di mana ia memiliki salinan beberapa perpustakaan eksternal. Pemelihara asli proyek memperbarui direktori ini dengan salinan perpustakaan eksternal yang lebih baru sesekali.

Seorang pengembang mengirimi saya permintaan tarik dengan ide untuk mengganti salinan ini dengan submitule git .

Dan saya sedang mempertimbangkan apakah itu ide yang bagus atau tidak.

Git submodule Pros:

  • Submodules dirancang khusus untuk skenario serupa
  • Ini menghapus kemungkinan komit tidak disengaja kepada Vendor yang akan ditimpa saat pembaruan berikutnya

Git submodule Cons:

  • Sepertinya git submodule mendorong kompleksitas dari pengelola ke orang yang akan mengkloning / menarik proyek (langkah-langkah tambahan yang diperlukan setelah Anda mengkloning untuk mulai bekerja dengan proyek: "git submodule init", "git submodule update"

Apa pendapat Anda tentang ini?

Satu hal lagi. Masalah ini adalah perpustakaan ukuran yang cukup kecil dengan dependensi eksternal yang sangat terbatas. Saya pikir alat build apa pun akan berlebihan untuk saat ini.

Victor Ronin
sumber
4
Atau mereka dapat melakukan git clone --recursivedan kemudian tidak harus melakukan perintah submodule. Tidak ada orang lain yang menyebutkan berita gembira ini; kebanyakan orang yang saya kenal yang memiliki submodule mengiklankan ini di README.
Levi Morrison

Jawaban:

9

Alternatif untuk submodule adalah menggunakan git subtree. Ini memberikan manfaat git submoduletetapi tanpa mendorong kompleksitas kepada pengguna akhir. Repositori pihak ketiga digabungkan ke dalam pohon proyek utama, tetapi ada metadata yang disimpan sedemikian rupa sehingga Anda bisa:

  • ekstrak repositori pihak ketiga nanti, jika ada perubahan menarik telah dilakukan
  • menggabungkan pembaruan baru dari repositori pihak ketiga ( gabungan catatan , bukan menimpa)

Untuk pengguna Git yang tidak cukup canggih untuk memahami submodul, pendekatan subtree membuat mendapatkan klon proyek Anda tidak lebih sulit daripada klon lainnya. Sebuah uraian singkat dari dokumentasi:

Subtrees memungkinkan sub proyek untuk dimasukkan dalam subdirektori dari proyek utama, opsional termasuk seluruh sejarah proyek.

Misalnya, Anda dapat memasukkan kode sumber untuk perpustakaan sebagai subdirektori dari aplikasi Anda.

Subtrees tidak menjadi bingung dengan submodules, yang dimaksudkan untuk tugas yang sama. Tidak seperti submodula, subtree tidak memerlukan konstruksi khusus (seperti file .gitmodule atau gitlink) ada di repositori Anda, dan tidak memaksa pengguna akhir repositori Anda untuk melakukan sesuatu yang istimewa atau untuk memahami bagaimana subtree bekerja. Subtree hanyalah subdirektori yang dapat berkomitmen untuk, bercabang, dan digabungkan bersama dengan proyek Anda dengan cara apa pun yang Anda inginkan.

Saya telah membuat proyek di tempat kerja menggunakan submodula, dan masalah dengan menjaga agar submodula selalu mutakhir di klon semua orang terlalu banyak pekerjaan. Saya baru-baru ini berubah menggunakan subtree di mana-mana dan masalah-masalah itu hilang.

Perhatikan bahwa git-subtree adalah bagian dari git/contribdirektori, dan harus diinstal secara terpisah.

Greg Hewgill
sumber
4

Salah satu kelemahan menggunakan submodula adalah bahwa tarbal atau arsip zip di Github (dan banyak layanan lainnya) tidak termasuk sumber submodul. Artinya, arsip tidak mandiri. Ini menjadi masalah jika repositori kecil dan tidak benar-benar memiliki skrip build, seperti situs HTML statis tergantung pada pustaka JavaScript.

Lekensteyn
sumber
3

Ini adalah tempat yang ideal untuk menggunakan submodula. Mereka mengurangi ukuran dan kompleksitas repositori Anda dan membuatnya lebih mudah untuk memperbarui perpustakaan eksternal ke versi baru.

Mereka tidak sulit untuk mengetahui cara menggunakan, dan mereka cukup umum digunakan dalam situasi ini, jadi buat catatan di README proyek bahwa Anda menggunakan submodul dan apa yang harus dilakukan, dan orang-orang harus dapat mengetahui itu keluar. Pertama kali saya menemukan repositori dengan submodule, saya mendapatkannya dan berjalan dalam 10 hingga 15 menit dan tidak pernah memiliki masalah dengan mencari tahu apa yang harus dilakukan sejak itu.

Jonathan Patt
sumber
1
Sebagai tambahan untuk ini, jika aplikasi Anda gagal diinisialisasi, Anda mungkin ingin memberi tanda centang pada tempat untuk memverifikasi bahwa submodule telah diinisialisasi - dan memberikan pesan kesalahan yang ramah jika belum.
Jonathan Rich
1
Juga lihat jawaban Lekensteyn tentang arsip zip yang kurang memiliki file submodule. Ini berarti submodul mungkin bukan pendekatan terbaik jika Anda memasok kode secara publik, tetapi boleh untuk kode pribadi yang dijamin akan dikloning. Kalau tidak, lebih suka subtrees.
Insinyur
3

Menggunakan submodul mencegah Anda membuat perubahan lokal pada kode & menciptakan ketergantungan pada repositori eksternal. Jika Anda yakin Anda tidak akan pernah ingin menyesuaikan perpustakaan atau membuat perbaikan bug lokal dan dapat memastikan bahwa server eksternal akan selalu tersedia ketika Anda ingin mengkloning salinan baru mereka adalah cara untuk pergi.

Singkatnya - apakah Anda hanya ingin menggunakan libs atau Anda menganggapnya bagian dari basis kode Anda? Jika itu bukan kode 'Anda', mengapa mereka berada dalam kontrol versi dan bukan hanya sesuatu yang Anda perlukan untuk menginstal?

Sean McSomething
sumber
6
Submodules tidak mencegah Anda membuat perubahan lokal. Sebaliknya, mereka memungkinkan Anda untuk melacak perubahan itu dan menggunakan versi yang berbeda (tweak Anda atau rilis perpustakaan) dari perpustakaan di berbagai proyek.
Steve Fallows