Saya akan bekerja dengan orang lain pada kode dari proyek yang menggunakan cvs. Kami ingin menggunakan vcs terdistribusi untuk membuat pekerjaan kami dan ketika kami selesai atau mungkin sesekali kami ingin memasukkan kode kami dan semua riwayat revisi kami ke cvs. Kami tidak memiliki akses tulis ke repo cvs proyek sehingga kami tidak bisa terlalu sering melakukan. Alat apa yang dapat kita gunakan untuk mengekspor riwayat revisi ke cvs? Saat ini kami berpikir untuk menggunakan git atau mercurial tetapi kami dapat menggunakan vcs terdistribusi lain jika itu dapat mempermudah ekspor.
100
Jawaban:
Untungnya bagi kita yang masih terpaksa menggunakan CVS, git menyediakan alat yang cukup bagus untuk melakukan apa yang ingin Anda lakukan. Saran saya (dan apa yang kami lakukan di sini di $ work):
Membuat Klon Awal
Gunakan
git cvsimport
untuk menggandakan riwayat revisi CVS ke dalam repositori git. Saya menggunakan doa berikut:The
-A
pilihan adalah opsional tapi membantu untuk membuat sejarah revisi Anda yang diimpor dari CVS terlihat lebih git-seperti (lihatman git-cvsimport
untuk info lebih lanjut tentang bagaimana hal ini sudah diatur).Bergantung pada ukuran dan riwayat penyimpanan CVS, pengimporan pertama ini akan memakan waktu SANGAT lama. Anda dapat menambahkan -v ke perintah di atas jika Anda ingin ketenangan pikiran bahwa sebenarnya ada sesuatu yang terjadi.
Setelah proses ini selesai, Anda akan memiliki
master
cabang yang seharusnya mencerminkan HEAD CVS (dengan pengecualian yanggit cvsimport
secara default mengabaikan komitmen 10 menit terakhir untuk menghindari penangkapan komit yang setengah selesai). Anda kemudian dapat menggunakangit log
dan teman untuk memeriksa seluruh riwayat repositori seolah-olah telah menggunakan git sejak awal.Konfigurasi Tweaks
Ada beberapa penyesuaian konfigurasi yang akan membuat impor tambahan dari CVS (serta ekspor) lebih mudah di masa mendatang. Ini tidak didokumentasikan di
git cvsimport
halaman manual jadi saya kira mereka bisa berubah tanpa pemberitahuan tetapi, FWIW:Semua opsi ini dapat ditentukan di baris perintah sehingga Anda dapat melewati langkah ini dengan aman.
Impor Tambahan
Selanjutnya
git cvsimport
harus jauh lebih cepat daripada pemanggilan pertama. Namun, itu dilakukancvs rlog
pada setiap direktori (bahkan yang hanya memiliki file diAttic
dalamnya) sehingga masih dapat memakan waktu beberapa menit. Jika Anda telah menentukan konfigurasi yang disarankan di atas, yang perlu Anda lakukan hanyalah mengeksekusi:Jika Anda belum mengatur konfigurasi Anda untuk menentukan default, Anda harus menentukannya pada baris perintah:
Bagaimanapun, dua hal yang perlu diingat:
cvsimport
yang akan memakan waktu lama lagi.master
cabang Anda sehingga perubahan dapat digabungkan (atau didasarkan kembali) ke cabang lokal / topik Anda.Membuat Perubahan Lokal
Dalam praktiknya, saya merekomendasikan untuk selalu membuat perubahan pada cabang dan hanya menggabungkan
master
ketika Anda siap untuk mengekspor perubahan tersebut kembali ke repositori CVS. Anda dapat menggunakan alur kerja apa pun yang Anda suka di cabang-cabang Anda (menggabungkan, rebasing, squashing, dll) tetapi tentu saja aturan rebasing standar berlaku: jangan rebase jika ada orang lain yang mendasarkan perubahan mereka pada cabang Anda.Mengekspor Perubahan ke CVS
The
git cvsexportcommit
perintah memungkinkan Anda untuk mengekspor satu komit keluar ke server CVS. Anda dapat menentukan satu ID komit (atau apa pun yang mendeskripsikan komit spesifik seperti yang didefinisikan diman git-rev-parse
). Perbedaan kemudian dihasilkan, diterapkan ke pembayaran CVS dan kemudian (opsional) dikomit ke CVS menggunakancvs
klien sebenarnya . Anda dapat mengekspor setiap komitmen mikro pada cabang topik Anda, tetapi umumnya saya ingin membuat komit gabungan secara terbarumaster
dan mengekspor komitmen gabungan tunggal itu ke CVS. Saat Anda mengekspor komit gabungan, Anda harus memberi tahu git induk komit mana yang akan digunakan untuk menghasilkan diff. Selain itu, ini tidak akan berfungsi jika penggabungan Anda dipercepat (lihat bagian "BAGAIMANA CARA PENGGABUNGAN"man git-merge
untuk deskripsi tentang penggabungan maju-cepat) jadi Anda harus menggunakan--no-ff
opsi saat melakukan penggabungan. Berikut contohnya:Anda dapat melihat arti dari setiap opsi tersebut di halaman manual untuk git-cvsexportcommit . Anda memiliki opsi untuk menyetel
-w
opsi di konfigurasi git Anda:Jika tambalan gagal karena alasan apa pun, pengalaman saya adalah bahwa Anda (sayangnya) mungkin lebih baik menyalin file yang diubah secara manual dan melakukan menggunakan klien cvs. Namun, hal ini tidak boleh terjadi jika Anda memastikan
master
CVS sudah diperbarui sebelum menggabungkan cabang topik Anda di.Jika komit gagal karena alasan apa pun (masalah jaringan / izin, dll), Anda dapat mengambil perintah yang dicetak ke terminal Anda di akhir keluaran kesalahan dan menjalankannya di direktori kerja CVS Anda. Biasanya terlihat seperti ini:
Lain kali Anda melakukan
git cvsimport
(menunggu setidaknya 10 menit), Anda akan melihat patch dari komit yang Anda ekspor diimpor kembali ke repositori lokal Anda. Mereka akan memiliki ID komit yang berbeda karena komit CVS akan memiliki stempel waktu yang berbeda dan mungkin nama pelaku yang berbeda (tergantung pada apakah Anda menyiapkan file penulis di awal Anda dicvsimport
atas).Mengkloning klon CVS Anda
Jika Anda memiliki lebih dari satu orang yang perlu melakukan ini
cvsimport
, akan lebih efisien jika memiliki satu repositori git yang menjalankan cvsimport dan membuat semua repositori lain dibuat sebagai klon. Ini bekerja dengan sempurna dan repositori kloning dapat melakukan cvsexportcommits seperti yang dijelaskan di atas. Namun, ada satu peringatan. Karena cara CVS melakukan kembali dengan ID komit yang berbeda (seperti dijelaskan di atas), Anda tidak ingin cabang kloning Anda melacak repositori git pusat. Secara default, ini adalah caragit clone
mengkonfigurasi repositori Anda tetapi ini mudah diperbaiki:Setelah Anda menghapus konfigurasi ini, Anda harus secara eksplisit mengatakan di mana dan apa yang harus ditarik ketika Anda ingin menarik komit baru dari repositori pusat:
Secara keseluruhan, menurut saya alur kerja ini cukup mudah dikelola dan "hal terbaik berikutnya" saat bermigrasi sepenuhnya ke git tidaklah praktis.
sumber
git cvsimport
Debian cobaapt-get install git-cvs
Initialized empty Git repository in /Users/gus/projects/foo/foobar/.git/ Can't exec "cvsps": No such file or directory at /Applications/Xcode.app/Contents/Developer/usr/libexec/git-core/git-cvsimport line 777. Could not start cvsps: No such file or directory git cvsimport: fatal: cvsps reported error
Sayangnya, hal ini tidak membuat Anda terhindar dari tidak adanya CVS :(Anda tidak boleh mempercayai cvsimport secara membabi buta dan memeriksa apakah pohon yang diimpor cocok dengan yang ada di repo CVS. Saya telah melakukan ini dengan membagikan proyek baru menggunakan plug-in CVS eclipse dan menemukan bahwa ada ketidakkonsistenan ..
Dua komit yang dilakukan dalam waktu kurang dari satu menit dengan pesan komit yang sama (untuk mengembalikan file yang salah terhapus) dikelompokkan menjadi satu komit besar, yang mengakibatkan file hilang dari pohon ..
Saya dapat mengatasi masalah ini dengan mengubah parameter 'fuzz' menjadi kurang dari satu menit.
contoh:
Intinya: periksa pohon Anda setelah mengimpor
sumber
Selain jawaban Brian Phillips: ada juga git-cvsserver yang berfungsi seperti server CVS tetapi sebenarnya mengakses git repositori ... tetapi memiliki beberapa keterbatasan.
sumber