Cabang remote dari git-svn hampir sama dengan remote Git biasa. Jadi di repositori lokal Anda, Anda dapat memiliki klon git-svn dan mendorong perubahan ke GitHub. Git tidak peduli. Jika Anda membuat git-svn clone dan mendorong perubahan yang sama persis ke GitHub, Anda akan memiliki mirror tidak resmi dari repositori Google Code. Sisanya adalah vanilla Git.
git svn clone http://example.googlecode.com/svn -s
git remote add origin [email protected]:example/example.git
git push origin master
Sekarang Anda sudah memiliki ini, kadang-kadang Anda harus menyinkronkan repositori Subversion dengan Git. Ini akan terlihat seperti:
git svn rebase
git push
Di gitk atau apa pun, ini akan terlihat seperti ini:
o [master][remotes/trunk][remotes/origin/master]
|
o
|
o
Dan ketika Anda berlari git svn rebase
, Anda akan memiliki ini:
o [master][remotes/trunk]
|
o
|
o [remotes/origin/master]
|
o
|
o
Jadi sekarang menjalankan git push
akan mendorong komit ke GitHub, cabang [remote / asal / master] di sana. Dan Anda akan kembali ke skenario di diagram seni ASCII pertama.
Masalahnya sekarang adalah, bagaimana Anda mengerjakan perubahan Anda ke dalam campuran? Idenya adalah, Anda tidak pernah berkomitmen ke cabang yang sama dengan git-svn-rebase-ing dan git-push. Anda memerlukan cabang terpisah untuk perubahan Anda. Jika tidak, Anda akan berakhir dengan mem-rebound perubahan Anda di atas yang Subversion, yang dapat mengganggu siapa saja yang mengkloning repositori Git Anda. Ikuti aku? OK, jadi Anda membuat cabang, sebut saja "fitur". Dan Anda membuat komit dan mendorongnya ke GitHub ke cabang fitur. Gitk Anda akan terlihat seperti ini:
o [features][remotes/origin/features]
|
o
|
o [master][remotes/trunk][remotes/origin/master]
|
o
Di sini Anda punya fitur Anda bercabang beberapa komitmen di depan cabang Google Code, kan? Jadi apa yang terjadi ketika Anda ingin memasukkan hal-hal baru dari Google Code? Anda sudah lari git svn rebase
dulu dan dapatkan ini:
o [features][remotes/origin/features]
[master][remotes/trunk] o |
| o
o /
|/
o[remotes/origin/master]
|
o
Jika Anda git push
menguasai, Anda bisa membayangkan [remote / asal / master] berada pada titik yang sama dengan master. Tetapi cabang fitur Anda tidak memiliki perubahan. Pilihan Anda sekarang adalah menggabungkan master menjadi fitur, atau rebase fitur. Gabungan akan terlihat seperti ini
git checkout features
git merge master
o [features]
/|
/ o [remotes/origin/features]
[master] o |
| o
o /
|/
o
|
o
Kemudian Anda mendorong fitur ke GitHub. Saya telah meninggalkan remote untuk master untuk menghemat ruang, mereka akan berada pada titik yang sama dengan [master] .
Pendekatan rebase sedikit lebih jahat - Anda harus mendorong dengan - memaksa karena dorongan Anda tidak akan menjadi penggabungan maju cepat (Anda akan menarik cabang fitur dari bawah seseorang yang telah mengkloningnya). Ini tidak benar-benar dianggap OK untuk melakukan ini, tetapi tidak ada yang bisa menghentikan Anda jika Anda bertekad. Itu memang membuat beberapa hal lebih mudah juga, seperti ketika tambalan diterima di hulu dalam bentuk yang sedikit dikerjakan ulang. Ini akan menghemat karena harus dipusingkan dengan konflik, Anda hanya dapat rebase - lewati patch yang di-upstream. Bagaimanapun, rebase akan seperti ini:
git rebase master features
o [features]
|
o
| o [remotes/origin/features]
[master] o |
| o
o /
|/
o
|
o
Dan kemudian Anda harus melakukannya git push --force
. Anda dapat melihat mengapa Anda harus memaksanya, sejarah memiliki perpecahan lama yang besar dari [remote / asal / fitur] ke [fitur] post-rebase baru saat ini .
Ini semua bekerja, tetapi banyak usaha. Jika Anda akan menjadi kontributor tetap, taruhan terbaik adalah bekerja seperti ini untuk sementara waktu, mengirim beberapa tambalan ke hulu dan melihat apakah Anda bisa mendapatkan akses komit ke Subversion. Jika gagal, mungkin jangan mendorong perubahan Anda ke GitHub. Buat mereka tetap lokal dan coba agar mereka diterima di hulu
git
noob di sini.) Pertanyaan cepat. Saya melakukan ini terhadap repo SVN besar dan hasilnya ~ 141 megabita. Saya mendorongnya ke github dan kemudian mengkloningnya kembali, dan hasilnya mencapai 130 megabita. Saya berlarigit gc
pada keduanya. Apa yang bisa menjelaskan perbedaannya?git push origin --mirror
.-s
pilihan untukgit svn clone
, tetapi tanpa itu sisanya bekerja dengan baik.layanan svn2github
Situs web http://svn2github.com/ menyediakan layanan untuk membayar semua repositori SVN yang dapat diakses publik ke Github (di https://github.com/svn2github/projectname ). Saya mencobanya; setelah menekan "Buat cermin" ternyata tidak melakukan apa-apa selama beberapa detik dan menampilkan pesan "kesalahan", tetapi sebenarnya berhasil. Repositori baru sebenarnya dibuat, berisi kode dari repo SVN.
Anda kemudian akan bercabang repositori yang dibuatnya, dan bekerja pada garpu Anda sendiri. Anda kemudian akan mengirimkan perubahan Anda ke proyek hulu menggunakan bugtracker mereka.
Melihat repositori yang ada di bawah pengguna Github layanan (mis. "Svn2github didorong untuk menguasainya di svn2github / haxe 5 jam yang lalu"), tampaknya secara teratur menarik perubahan dari repositori SVN. Tidak ada informasi tentang siapa yang menjalankan layanan di situs web, jadi saya tidak akan bertaruh akan terus berjalan tanpa batas waktu, tetapi berfungsi untuk saat ini (dan jika itu turun, Anda masih dapat memperbarui garpu secara manual).
Landasan peluncuran
Jika Anda tidak menggunakan Git dan Github, alternatif lain adalah menggunakan Launchpad.net. Launchpad dapat secara otomatis mengimpor repositori SVN (juga CVS) ke cabang bzr pribadi. Untuk melakukan ini, buat proyek Launchpad, lalu buka halaman impor baru , pilih Subversion dan masukkan URL (misalnya
http://projectname.googlecode.com/svn/trunk/
). Bergantung pada ukuran proyek, impor awal dapat memakan waktu hingga beberapa jam. Impor selanjutnya akan berjalan secara berkala.Untuk dokumentasi lebih lanjut, lihat VCS Imports on Launchpad Help .
sumber
Panduan untuk menyinkronkan dari Google Code ke GitHub tersedia di fnokd.com . Penulis menggunakan server jarak jauh yang selalu aktif dan tugas cron untuk mengotomatiskan sinkronisasi dan menyimpan trunk SVN di cabang GitHub yang disebut "vendor".
sumber
GitHub sekarang mendukung mengimpor proyek-proyek subversi secara langsung (lihat http://help.github.com/import-from-subversion/ ). Cukup buat repo baru dan kemudian klik "Impor dari Subversion" di layar "Langkah Berikutnya". Itu tidak mendukung sinkronisasi lebih lanjut, meskipun: /.
sumber
Hmm .. Di perusahaan saya, saya melakukan hampir sama. Hanya memiliki repo .svn dan .git di direktori yang sama (Anda checkout repo svn dan membuat repo git dalam copy pekerjaan ini).
Kemudian menggunakan svn atas dan git push melakukan hal itu. Tentu saja jika Anda menyimpang banyak Anda harus menggabungkan hal-hal dengan tangan.
sumber
Saya tidak yakin apa yang Anda inginkan tetapi, tentu saja Anda dapat menarik dari repositori subversi dan mendorong ke repositori Git dari copy pekerjaan yang sama. Dan Anda juga dapat
git svn dcommit
kembali ke repositori subversi. Anda tidak dapat membuat sinkronisasi repositori GitHub terhadap repositori subversi. Juga, ketika Anda memiliki komit dalam copy pekerjaan Anda yang belum di repositori subversi Anda akan perlu rebase mereka jika repositori subversi diperbarui, memaksa Anda kegit push --force
"baru" berkomitmen untuk GitHub.sumber
Saya menemukan petunjuk ini di blog Yu-Jie Lin :
Klon pertama repositori Subversion dan dorong ke Git:
Setelah melakukan dalam repositori Subversion, jalankan
sumber