Saat ini perusahaan saya memiliki solusi Visual Studio dalam repo SVN yang diatur sebagai berikut:
SolutionFolder (~3.5 GB)
|-> SolutionName.sln
|-> .. Some source code folders... (~250 MB)
|-> ThirdParty (~3 GB)
|-> Tools
| -> Tool1
| -> Tool2
Tool1 dan Tool2 dibuat secara mandiri (memiliki solusi sendiri), tetapi menghasilkan file yang dapat dieksekusi yang digunakan dalam bangunan utama. Folder ThirdParty berisi semua dependensi untuk proyek, termasuk beberapa file .lib 100+ MB yang telah dikompilasi sebelumnya dan perpustakaan besar seperti boost.
Sangat mudah untuk memiliki semuanya dalam satu repo SVN sehingga (1) pengembang hanya perlu melakukan satu check-out, dan (2) kita tidak perlu melacak versi dependensi yang kita butuhkan untuk setiap versi build. Di sisi lain, perlu beberapa saat untuk memeriksa repo ini.
Apa cara terbaik untuk memindahkan struktur proyek ini ke git? Agaknya yang terbaik adalah mengecualikan ThirdParty dan mungkin Tools dari repo utama, tetapi kami ingin menjaga ThirdParty mudah diunduh dalam satu langkah, dan kami menyukainya versi (dan ketidakcocokan versi antara repo utama dan ThirdParty / Tools akan buruk).
Pada titik ini saya tidak tertarik melestarikan sejarah, hanya mencari tahu bagaimana mengatur proyek seperti itu.
sumber
Jawaban:
Gunakan alat yang tepat untuk pekerjaan itu. Di Windows, itu artinya
Gunakan NuGet untuk dependensi pihak ketiga
Dengan begitu, Anda menjaga dependensi pihak ketiga dalam versi berversi, tetapi Anda tidak akan mengasapi repositori Anda dengan hal-hal yang tidak dibutuhkan. Checkout lebih cepat, dan proyek diatur sebagaimana mestinya. Anda dapat mengaktifkan opsi di Visual Studio sehingga selalu mengunduh semua dependensi secara otomatis.
Tentu saja Anda dapat menggunakan solusi yang hanya menggunakan git (repo lain, submodul dll), tapi itu hanya peretasan. Melakukannya dengan cara yang benar akan membuahkan hasil dengan cepat, dan meninggalkan Anda dengan sistem bukti masa depan.
Edit setelah komentar: Cara terbaik untuk menggunakan NuGet adalah dengan mengatur sumber NuGet lokal, baik pada drive bersama, atau server nuget penuh. Pengaturan seharusnya tidak memakan waktu lebih dari beberapa menit. Dengan begitu, Anda dapat menjamin bahwa semua paket yang Anda butuhkan selalu tersedia, di mana pun mereka berasal.
sumber
Anda dapat menggunakan submodula untuk alat-alat tersebut. Dengan begitu Anda bisa menyimpannya dalam subdirektori seperti yang Anda lakukan sekarang, dan menggunakan repo yang terpisah untuk membuat versi mereka. Itu juga berarti Anda dapat mengkloning (checkout) alat-alat itu dan mengembangkannya secara terpisah, dan bahwa proyek-proyek lain dapat mengandalkan repo-repo itu - dan pada versi-versi yang spesifik dan dapat diterima juga.
Anda juga bisa menggunakan submodul untuk pustaka pihak ketiga, tetapi jika memungkinkan saya akan merekomendasikan menggunakan manajer dependensi untuk itu.
sumber
Entitas yang Anda ubah menjadi repositori git tentu saja entitas yang Anda versi dan cabang; jika
SolutionFolder/Tools/Tool1
sesuai dengan satu hal seperti itu, itulah tingkat entitas. Ini karena git menganggap seluruh status pohon direktori sebagai entitas yang dapat versi, sedangkan dengan svn dimungkinkan (bahkan jika bukan ide yang baik) untuk memilikitrunk
,branches
dan ditags
mana saja di dalam pohon.Artefak yang diturunkan tidak boleh disimpan di repositori, atau perpustakaan eksternal. Ada cara yang lebih baik untuk mengatasinya. (Jika Anda bekerja dengan Java, pertimbangkan untuk menggunakan repositori Maven pribadi; itu relatif mudah digunakan, dan terintegrasi dengan baik dengan banyak hal lain.)
Jika Anda terbiasa dengan alur kerja yang memiliki segalanya dalam satu repo untuk kemudahan checkout, pertimbangkan memiliki skrip yang mengatur semuanya.
sumber
ThirdParty
folder di repo sangat nyaman, dan sulit untuk datang dengan alternatif yang baik.Sejujurnya saya tidak akan mengubah apa pun di pengaturan Anda. Itulah tepatnya yang sedang kita lakukan sekarang. Saya bermain-main dengan menyiapkan repositori git terpisah untuk menangani lib pihak ketiga yang kami gunakan, tetapi saya tidak berpikir itu berbobot dengan biaya portabilitas. Sekarang setiap pengembang dapat checkout dan memulai tanpa harus melakukan langkah-langkah pengaturan manual. Dan saya pun membangun server / slave dapat membangun proyek. Kecuali Anda memiliki multi repo berbagi alat pihak ketiga saya hanya akan tetap dengan pengaturan Anda saat ini.
Apa yang saya lakukan bermain-main adalah menyiapkan alat pihak ketiga dalam repo terpisah. Lalu aku punya satu skrip batch sederhana membaca file teks dengan sha1 ref dan checkout versi yang benar. Ini akan memungkinkan saya untuk memiliki versi pihak ketiga yang berbeda untuk proyek yang berbeda. Saya mendapat ide ini dari alat pembuatan Facebook Buck. Tetapi pada akhirnya banyak pengembang tidak suka menggunakan alat baris perintah (toko MS VC di sini) jadi saya menyerah pada ide.
Salah satu alasan utama mengapa tidak mengunduh lib pihak ketiga Anda saat Anda membutuhkannya (menggunakan NuGet) adalah jika Anda perlu mendukung produk Anda untuk waktu yang lama. Di industri saya, kami terkadang harus menyediakan pembaruan untuk versi lama yang bergantung pada lib pihak ketiga yang lama. Kami tidak ingin menghabiskan banyak waktu memilah lib mana yang dapat kami tingkatkan atau tidak dan hanya menggunakan lib seperti yang digunakan dalam versi itu. Sekarang bayangkan Anda menggunakan NuGet, oops ... versi terbaru dari lib yang Anda butuhkan adalah 3,98 tetapi Anda perlu 2,04 ..... bagaimana menjelaskan kepada atasan Anda bahwa Anda harus menghabiskan 2 bulan untuk meningkatkan versi lama agar dapat meningkatkan versi lama untuk dapat untuk menggunakan lib terbaru ketika dia mengharapkan perubahan kecil!
sumber