Sunting: tidak seperti beberapa pertanyaan serupa seperti Memindahkan repo multi-GB SVN ke Git atau /programming/540535/managing-large-binary-files-with-git Skenario saya tidak melibatkan beberapa sub proyek yang dapat dengan mudah dikonversi menjadi git submoduels, atau beberapa file biner yang sangat besar yang cocok untuk git-annex. Ini adalah repositori tunggal di mana binari adalah suite uji yang digabungkan erat dengan kode sumber utama dari revisi yang sama, sangat mirip jika mereka mengkompilasi aset waktu seperti grafik.
Saya sedang menyelidiki mengganti repositori kode svn yang berukuran sedang / besar (50 pengguna, revisi 60k, riwayat 80Gb, copy pekerjaan 2Gb). Karena jumlah pengguna telah bertambah, ada banyak churn di dalam trunk, dan fitur-fitur sering tersebar pada banyak komit yang membuat peninjauan kode sulit dilakukan. Juga tanpa bercabang tidak ada cara untuk "gerbang" kode buruk keluar, ulasan hanya dapat dilakukan setelah berkomitmen untuk trunk. Saya sedang menyelidiki alternatif. Aku berharap kita bisa pindah ke git, tapi aku punya masalah.
Masalah dengan repo saat ini sejauh git pergi adalah ukuran. Ada banyak cruft tua di sana, dan membersihkannya dengan --filter-cabang saat mengkonversi ke git dapat memotongnya dalam ukuran dengan urutan besarnya, menjadi sekitar 5-10GB. Ini masih terlalu besar. Alasan terbesar untuk ukuran repositori yang besar adalah bahwa ada banyak dokumen biner yang menjadi input untuk pengujian. File-file ini bervariasi antara .5mb dan 30mb, dan ada ratusan. Mereka juga memiliki banyak perubahan. Saya telah melihat submodules, git-annex dll, tetapi memiliki tes dalam submodule terasa salah, seperti halnya memiliki lampiran untuk banyak file yang Anda inginkan riwayat lengkap.
Jadi sifat git yang terdistribusi adalah yang menghalangi saya untuk mengadopsinya. Saya tidak begitu peduli tentang didistribusikan, saya hanya ingin fitur percabangan yang murah dan kuat. Seperti yang saya asumsikan 99,9% dari pengguna git lakukan, kita akan menggunakan repositori sentral yang diberkati dan telanjang.
Saya tidak yakin saya mengerti mengapa setiap pengguna harus memiliki riwayat lokal lengkap saat menggunakan git? Jika alur kerja tidak terdesentralisasi, apa yang dilakukan data pada disk pengguna? Saya tahu bahwa di git versi terbaru Anda dapat menggunakan klon dangkal dengan hanya riwayat terbaru. Pertanyaan saya adalah: apakah layak untuk melakukan ini sebagai mode operasi standar untuk seluruh tim? Bisakah git dikonfigurasi agar selalu dangkal sehingga Anda dapat memiliki riwayat lengkap hanya secara terpusat, tetapi pengguna secara default hanya memiliki 1000 putaran sejarah? Pilihan untuk itu tentu saja untuk hanya mengkonversi 1000 revs ke git, dan menyimpan repo svn untuk arkeologi. Namun dalam skenario itu, kami akan menghadapi masalah yang sama lagi setelah beberapa ribu revisi berikutnya ke dokumen uji.
- Apa yang baik praktek terbaik untuk menggunakan git dengan repo besar berisi banyak file biner yang Anda lakukan ingin sejarah untuk? Kebanyakan praktik terbaik dan tutorial tampaknya menghindari kasus ini. Mereka memecahkan masalah beberapa binari besar, atau mengusulkan menjatuhkan binari sepenuhnya.
- Apakah kloning yang dangkal dapat digunakan sebagai mode operasi normal atau itu "hack"?
- Bisakah submodula digunakan untuk kode di mana Anda memiliki ketergantungan yang ketat antara revisi sumber utama dan revisi submodule (seperti dalam kompilasi dependensi biner waktu, atau unit test unit)?
- Seberapa besar "terlalu besar" untuk repositori git (di tempat)? Haruskah kita menghindari beralih jika kita bisa turun ke 4GB? 2GB?
Jawaban:
Wow, itu pertanyaan panjang (dan masalah yang rumit). Saya akan mencoba melakukannya.
Ini adalah keputusan desain utama dengan git. Untuk alasan yang tepat Anda harus bertanya kepada penulis (Linus Torvalds), tetapi sejauh yang saya tahu, alasan utamanya adalah kecepatan: Memiliki segala sesuatu yang lokal (pada disk cepat atau bahkan di-cache dalam RAM) membuat operasi pada sejarah lebih cepat dengan menghindari akses jaringan.
Itulah poin yang akan saya pikirkan pertama kali. Memiliki begitu banyak file biner yang terus berubah dalam kontrol sumber tampaknya bermasalah bagi saya (bahkan dengan SVN). Tidak bisakah Anda menggunakan pendekatan yang berbeda? Ide ide:
Tidak seperti kode sumber, file biner 3 MB mungkin tidak ditulis dengan tangan. Jika beberapa alat / proses menghasilkannya, pertimbangkan untuk mengintegrasikannya ke dalam build Anda, alih-alih menyimpan data.
Jika itu tidak praktis, file biner biasanya lebih baik dalam repositori artefak (seperti Artifactory for Maven & co.). Mungkin itu pilihan bagi Anda.
Sebenarnya, ini terlihat seperti git-lampiran akan sangat cocok. git-annex pada dasarnya memungkinkan Anda untuk menyimpan konten file di luar repositori git (repositori malah berisi placeholder). Anda dapat menyimpan konten file dalam berbagai cara (central git repo, drive bersama, penyimpanan cloud ...), dan Anda dapat mengontrol konten mana yang ingin Anda miliki secara lokal.
Apakah Anda mungkin salah paham bagaimana git-lampiran bekerja? git-annex menyimpan histori penuh untuk semua file yang dikelolanya - itu hanya memungkinkan Anda memilih konten file mana yang ingin Anda miliki secara lokal.
Akhirnya, tentang pertanyaan Anda:
Dalam pengalaman saya, opsi biasanya adalah:
Itu mungkin bisa dilakukan; Namun, saya tidak berpikir ini akan menyelesaikan masalah Anda:
Itu tergantung pada struktur repo (beberapa / banyak file dll), pada apa yang ingin Anda lakukan, pada seberapa gemuk komputer Anda, dan pada kesabaran Anda :-).
Untuk memberi Anda ide cepat: Pada laptop saya (agak baru, tapi rendah spesifikasi), melakukan file 500 MB membutuhkan waktu 30-60 detik. Hanya daftar riwayat (git log dll.) Tidak terpengaruh oleh file besar; hal-hal seperti "git log -S" yang harus memindai konten file sangat lambat - namun, kecepatannya didominasi oleh I / O, jadi itu bukan kesalahan git.
Pada repo 3 GB dengan sedikit revisi, "git log -S" membutuhkan waktu sekitar satu menit.
Jadi saya akan mengatakan beberapa GB baik-baik saja, meskipun tidak ideal. Lebih dari 10-20 GB mungkin mendorongnya, tetapi mungkin bisa dilakukan - Anda harus mencobanya.
sumber
Pindah ke git tidak akan menyelesaikan masalah ini, itu adalah masalah dalam cara Anda menggunakan alat dan jika Anda menggunakan git dengan cara yang sama, masalah akan tetap ada.
Anda dapat bercabang di svn dengan mudah di git, dan penggabungan pada umumnya sama mudahnya dan memiliki perangkap yang sama. Git dirancang untuk bekerja dengan kode sumber kernel, sehingga ia membuat beberapa asumsi yang mungkin tidak berlaku dalam semua kasus, seperti milik Anda dengan binari besar dan sejarah besar. Maksud di balik DVCS adalah bahwa setiap pengguna secara efektif bekerja sendiri dan hanya berkolaborasi setelah itu - yaitu mereka memiliki repo sendiri (salinan), bekerja sesuka mereka dan kemudian mendorong perubahan kepada siapa pun yang menginginkannya. Sebuah sistem gabungan yang digunakan dalam pengembangan kernel linux sangat cocok untuk ini - Anda mendorong perubahan Anda ke orang berikutnya di rantai yang menggabungkannya dengan basis kode-nya dan kemudian mendorongnya ke orang berikutnya hingga sampai ke Linus yang memasukkannya ke dalam rilis. Sebagian besar tim menggunakan git dengan cara yang sama, tetapi dengan hanya 1 orang upstream yang sering menjadi repo 'server' sisi server,
Jadi saya akan melihat mengubah alur kerja Anda terlebih dahulu, hanya bermigrasi ke git setelah Anda memiliki cara kerja yang lebih baik. Menerapkan percabangan dan penggabungan dalam SVN, jika Anda tidak mengganti nama file atau penggabungan direktori berjalan dengan baik.
sumber
Lihatlah milis GCC. Migrasi pohon sumber penyusun GCC dari SVN ke GIT sedang dibahas saat ini (Agustus & September 2015), sambil tetap menyimpan riwayat GCC. Lihat misalnya repositori untuk mesin konversi & Kriteria penerimaan untuk utas git konversi mail; Anda akan menemukan referensi ke alat dan prosedur yang berkaitan dengan konversi (yang tidak semudah kelihatannya; konversi sejarah basis kode yang begitu besar membutuhkan 36 jam dan sekitar 64Gbytes RAM, IIRC)
sumber
Jika mengubah seluruh repositori SVN menjadi Git menghasilkan repositori besar yang tidak layak untuk dikloning , Anda dapat mencoba menggunakan SubGit untuk membuat cermin Git yang lebih kecil untuk bagian-bagian tertentu dari repositori Subversion Anda.
Misalnya, Anda dapat mengimpor dan menyinkronkan beberapa subdirektori dari repositori SVN Anda
http://domain/repos/trunk/project/src
:Untuk detail lebih lanjut tentang penggunaan SubGit, rujuk ke dokumentasinya .
Segera setelah Anda memiliki Git mirror dari direktori itu, Anda dapat menggunakan repositori Git untuk mengirimkan perubahan baru yang langsung tercermin dalam repositori SVN. Karena Anda hanya menyinkronkan bagian tertentu dari repositori SVN yang menyusutkan ukuran repositori Git yang dikonversi secara signifikan dan Anda masih dapat membuat cabang, menggabungkannya, menggunakan alur kerja apa pun dari sisi Git.
Atau, Anda dapat mengimpor seluruh gudang SVN tetapi mengecualikan file besar dari sinkronisasi:
Repositori Git yang dihasilkan harus memiliki ukuran yang wajar dan pengembang masih dapat menggunakan Git untuk mengirimkan perubahan mereka ke repositori Subversion.
Perhatikan bahwa solusi ini akan bekerja dengan baik untuk Anda jika Anda siap untuk menjaga server Subversion berjalan dan menggunakan Git di samping repositori SVN Anda.
Penafian: Saya salah satu pengembang SubGit; SubGit adalah perangkat lunak komersial dengan sejumlah opsi gratis yang tersedia.
sumber
Saya akan mendekati situasi Anda dengan cara berikut:
1) Inisialisasi repositori git di direktori yang sama dengan repo SVN Anda. Lakukan
git init
dangit remote add origin
mulai repo git itu. Dengan begitu Anda dapat terus berkomitmen pada SVN dan git secara terpisah tanpa berurusan dengan konversi penuh dari satu ke yang lain sampai Anda siap.2) Secara aktif menggunakan alat bfg dan filter-cabang untuk mencoba dan mengecilkan git repo Anda, seperti yang dibahas di sini: https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html
3) Gunakan git-annex, atau Git LFS, atau hanya server penyimpanan eksternal untuk binari besar Anda (mengangkut file menggunakan skrip shell saat membangun).
4) Setelah Anda merasa nyaman dengan strategi penggabungan / percabangan di git repo Anda, dan merasa nyaman dengan ukuran repo git Anda, Anda kemudian dapat melakukan migrasi penuh dari svn ke git.
Semoga ini membantu.
sumber