Mengelompokkan beberapa repositori Git yang merupakan bagian dari proyek keseluruhan yang sama


14

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?


Apakah komponen-komponen ini benar-benar bergantung satu sama lain, seperti hubungan antara komponen yang dapat dirilis dan perpustakaan? Atau apakah Anda hanya mencoba untuk menjaga semua komponen yang dapat dirilis Anda sinkron?
berguna

Inilah diskusi yang lebih lama tentang StackOverflow (secara ajaib belum ditutup).
Dan Dascalescu

Jawaban:


6

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 .


1
Mengunjungi kembali pada tahun 2016: Dokumen Hg masih menyebut subrepo sebagai fitur terakhir . Git docs lebih antusias, dan fitur submodule -nya kini lebih terintegrasi. Keduanya juga sekarang menangani repo bersarang dengan baik (mengenali repo bersarang "memiliki bola" dengan file yang dikelolanya), memberikan opsi sub-repo lain yang bermanfaat. Tetapi alat-alat DVCS masih mengutamakan repo tingkat tunggal, jadi peringatan "sub-repos => manajemen beberapa tingkat" dan "naga ada di sini" tetap relevan.
Jonathan Eunice

2

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.


2

Menurut pendapat saya, ini akan tergantung pada seberapa banyak mereka sebenarnya digabungkan. Sangat bagus untuk dapat menjalankan otomatis git bisectketika 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.

bagaimana Anda bisa "menautkan" repositori ini sehingga Anda akan tahu bahwa versi 2.0 dari aplikasi memerlukan versi 1.5 dari komponen server, dll?

Ini biasanya domain dari beberapa kerangka kerja manajemen dependensi (misalnya Gradle, Maven), bukan Git itu sendiri.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.