Fork dan sinkronkan repositori Google Code Subversion ke dalam GitHub


131

Bagaimana saya bisa bercabang dan tetap sinkron dengan repositori Google Code Subversion yang saya tidak punya akses tulis, ke repositori GitHub?

Saya ingin dapat mengembangkan fitur saya sendiri di repositori Git saya, tetapi saya juga ingin melakukan sinkronisasi dengan repositori Google Code Subversion. Untuk mengambil perbaikan dari sisi proyek Google Code.

Saya tahu tentang git-svn dan menggunakannya sebelum ke atas dan ke hilir ke repositori Subversion yang saya kendalikan sepenuhnya. Tapi saya tidak tahu bagaimana tetap sinkron dengan repositori Google Code Subversion.

Jawaban:


178

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 git@github.com: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 pushakan 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 rebasedulu dan dapatkan ini:

                           o [features][remotes/origin/features]
[master][remotes/trunk] o  |
                        |  o
                        o /
                        |/
                        o[remotes/origin/master]
                        |
                        o

Jika Anda git pushmenguasai, 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


Terima kasih untuk instruksi yang sangat baik. ( gitnoob 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 berlari git gcpada keduanya. Apa yang bisa menjelaskan perbedaannya?
mpontillo

... menemukannya. Saya membutuhkan git push origin --mirror.
mpontillo

Bekerja seperti pesona, sekarang saya hanya perlu memberitahu dev googlecode asli untuk menggunakan github dengan saya: D
electblake

Ini tidak bekerja untuk saya dengan -spilihan untuk git svn clone, tetapi tanpa itu sisanya bekerja dengan baik.
user1027169

15

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 .


10

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".



1

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.


Ja benar, tetapi saya ingin menghindari memiliki meta data yang Svn dan berharap git yang mampu menggunakan repo svn sebagai down menguasai aliran
optixx

Jadi bukankah mungkin menggunakan git-svn untuk checkout repo dan git push to github?
Marcin Gil

0

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 dcommitkembali 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 ke git push --force"baru" berkomitmen untuk GitHub.


0

Saya menemukan petunjuk ini di blog Yu-Jie Lin :

Klon pertama repositori Subversion dan dorong ke Git:

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo
git remote add git-foo git@github.com:username/foo.git 
git push git-foo master

Setelah melakukan dalam repositori Subversion, jalankan

cd /path/to/git-foo
git svn fetch 
git svn rebase 
git push git-foo master
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.