Katakanlah saya memiliki proyek yang memiliki banyak komponen: komponen server, komponen aplikasi web, komponen iOS, komponen Android, dll. Semua komponen ini adalah basis kode yang terpisah, tetapi juga digabungkan secara longgar (mis. Perubahan ke server kode dapat memerlukan perubahan ke semua komponen lain juga)
Apa cara paling efisien dalam Git untuk mengatur proyek ini? Jika Anda meletakkan semuanya dalam satu repositori, Anda akan selalu memiliki versi terbaru tetapi semuanya menjadi sangat berantakan ketika Anda mulai mengubah satu komponen dan bukan yang lain.
Di sisi lain, jika Anda membuat masing-masing komponen sebagai repositori terpisah, bagaimana Anda dapat "menautkan" repositori ini sehingga Anda akan tahu bahwa versi 2.0 dari aplikasi memerlukan versi 1.5 dari komponen server, dll?
Apakah ada fitur di git di luar menjaga readmes up to date (atau beberapa solusi yang lebih baik saya tidak melihat) untuk lebih efektif mengelola beberapa, terkait repo?
Jawaban:
Sub-proyek adalah tempat sistem kontrol versi terdistribusi (DVCS) mulai, jika tidak terurai, tentu menjadi sedikit miring.
Git submodul dan Mercurial subrepositories baik tujuan untuk dukungan sub-proyek. Keduanya telah meningkatkan rilis-per-rilis (ke titik bahwa "fitur ini ada di Mercurial lama, tetapi Anda mungkin tidak boleh menggunakannya" peringatan tidak lagi di depan dan di tengah.)
Tetap saja, multi-proyek repo tetap lebih dari kasus penggunaan khusus daripada fitur semua orang menggunakannya. Dokumentasi berisi banyak peringatan dan "bagaimana menggunakan ini" instruksi yang menjelaskan bahwa mengelola "proyek proyek" adalah masalah dua tingkat, dengan manajemen meta sedikit tetapi benar-benar berbeda dari manajemen proyek langsung, tingkat tunggal. Akibatnya, ada jauh lebih sedikit pengalaman di luar sana. Dan tidak ada kekurangan "jangan gunakan submit git!" dan "hindari subrepo lincah!" komentar dan posting blog.
Pengalaman saya sendiri dengan subrepo beragam. Itu berhasil ... tapi itu juga menjengkelkan. Saya suka ide sub-proyek, tetapi dalam praktiknya menemukan alternatif - baik repo besar all-in-one atau proyek saudara kawan - agar lebih mudah kusut (meskipun kurang elegan). Saya menantikan hari subrepo menjadi arus utama dan bukan menyusahkan, tetapi saya belum mengalaminya.
Ini bukan untuk mengatakan bahwa mengelola submodul / subrepo tidak akan bekerja untuk Anda, tetapi itu adalah sesuatu yang harus dilakukan dengan hati-hati, dan pasti beberapa eksperimen dan perencanaan sebelumnya.
Mengingat Anda berfokus pada Git, Anda juga harus menjelajahi subtitle Git, yang beberapa orang temukan sebagai alternatif yang lebih baik untuk submitran git .
sumber
Jika Anda menggunakan C #, Anda dapat menggunakan NuGet.
Jadikan masing-masing komponen perpustakaan dan simpan di repositori mereka sendiri. Buat rilis komponen dasar yang Anda versi sesuai dengan versi semantik.
Terakhir, minta buildserver Anda untuk mengemas pustaka ke dalam paket NuGet, dan gunakan paket NuGet itu dalam proyek untuk komponen front-end (iOS, Android).
Pendekatan dasar yang sama (dependensi versi dan paket) dapat digunakan dalam bahasa lain juga, tetapi mungkin tidak nyaman.
Saya tidak akan merekomendasikan Anda untuk menggunakan Submodules Git. Meskipun dapat digunakan untuk masalah-masalah seperti ini dalam teori, saya merasa ini lebih merepotkan daripada nilainya.
sumber
Menurut pendapat saya, ini akan tergantung pada seberapa banyak mereka sebenarnya digabungkan. Sangat bagus untuk dapat menjalankan otomatis
git bisect
ketika melacak regresi, tetapi ini akan sulit dilakukan jika setiap komit bergantung pada versi berbeda dari dependensi Anda yang lain untuk dijalankan.Dua opsi yang mungkin adalah satu repositori dengan submodul atau beberapa repositori dengan praktik versi yang baik.
Ini biasanya domain dari beberapa kerangka kerja manajemen dependensi (misalnya Gradle, Maven), bukan Git itu sendiri.
sumber