Saya telah melakukan semua pekerjaan saya di Git dan mendorong ke GitHub. Saya sangat senang dengan perangkat lunak dan situsnya, dan saya tidak ingin mengubah praktik kerja saya saat ini.
Penasihat PhD saya meminta semua siswa untuk menyimpan pekerjaan mereka di repositori SVN yang diselenggarakan di universitas. Saya telah menemukan banyak dokumentasi dan tutorial tentang menarik repositori SVN yang ada ke Git, tetapi tidak ada yang mendorong repositori Git ke repositori SVN yang baru. Saya berharap harus ada cara untuk melakukan ini dengan kombinasi git-svn dan cabang baru dan rebasing dan semua istilah yang indah, tapi saya seorang pemula Git dan tidak merasa percaya diri dengan salah satu dari mereka.
Saya kemudian ingin menjalankan beberapa perintah untuk mendorong commit ke repositori SVN ketika saya memilih. Saya ingin tetap menggunakan Git dan hanya memiliki mirror repositori SVN yang ada di Git.
Saya akan menjadi satu-satunya orang yang pernah berkomitmen ke SVN, jika ini ada bedanya.
Jawaban:
Saya membutuhkan ini juga, dan dengan bantuan jawaban Bombe + bermain-main, saya membuatnya bekerja. Inilah resepnya:
Impor Git -> Subversi
Setelah # 3 Anda akan mendapatkan pesan samar seperti ini:
Abaikan saja itu.
Ketika Anda menjalankan # 5, Anda mungkin mendapatkan konflik. Atasi ini dengan menambahkan file dengan status "unmerged" dan melanjutkan rebase. Akhirnya, Anda akan selesai; lalu sinkronkan kembali ke repositori SVN, menggunakan
dcommit
. Itu saja.Menyimpan repositori dalam sinkronisasi
Anda sekarang dapat menyinkronkan dari SVN ke Git, menggunakan perintah berikut:
Dan untuk menyinkronkan dari Git ke SVN, gunakan:
Catatan akhir
Anda mungkin ingin mencoba ini pada salinan lokal, sebelum mendaftar ke repositori langsung. Anda dapat membuat salinan repositori Git Anda ke tempat sementara; cukup gunakan
cp -r
, karena semua data ada di dalam repositori itu sendiri. Anda kemudian dapat mengatur repositori pengujian berbasis file, menggunakan:Dan periksa copy pekerjaan, menggunakan:
Itu akan memungkinkan Anda untuk bermain-main dengan hal-hal sebelum membuat perubahan yang langgeng.
Tambahan: Jika Anda mengacau
git svn init
Jika Anda secara tidak sengaja menjalankan
git svn init
dengan URL yang salah, dan Anda tidak cukup pintar untuk mengambil cadangan dari pekerjaan Anda (jangan tanya ...), Anda tidak bisa hanya menjalankan perintah yang sama lagi. Namun Anda dapat membatalkan perubahan dengan menerbitkan:Dan hapus bagian
[svn-remote "svn"]
seksi.Anda kemudian dapat menjalankan
git svn init
lagi.sumber
Inilah cara kami membuatnya berfungsi:
Kloning repositori Git Anda di suatu tempat di komputer Anda.
Buka .git / config dan tambahkan berikut ini (dari Mempertahankan cermin SVN read-only dari repositori Git ):
Sekarang, dari jendela konsol, ketikkan ini:
Sekarang, jika rusak di sini karena alasan apa pun, ketikkan tiga baris ini:
Dan akhirnya, Anda bisa berkomitmen ke SVN:
Catatan: Saya selalu memo folder itu sesudahnya.
sumber
Unable to determine upstream SVN information from HEAD history.
git merge -s recursive -Xtheirs --allow-unrelated-histories master
.Menggunakan
git rebase
secara langsung akan kehilangan komit pertama. Git memperlakukannya berbeda dan tidak dapat mem-rebase.Ada prosedur yang akan mempertahankan sejarah lengkap: http://kerneltrap.org/mailarchive/git/2008/10/26/3815034
Saya akan menuliskan solusinya di sini, tetapi kredit untuk Björn.
Inisialisasi git-svn:
--Prefix memberi Anda cabang pelacakan jarak jauh seperti "svn / trunk" yang bagus karena Anda tidak mendapatkan nama ambigu jika Anda memanggil cabang lokal Anda hanya "trunk" lalu. Dan
-s
merupakan jalan pintas untuk tata letak trunk / tag / cabang standar.Ambil barang awal dari SVN:
Sekarang lihat hash dari komit root Anda (harus menunjukkan komit tunggal):
Lalu dapatkan hash dari commit trunk yang kosong:
Buat korupsi:
Sekarang, "gitk" harus ditampilkan
svn/trunk
sebagai komit pertama yang menjadi dasar cabang master Anda.Jadikan cangkok permanen:
Jatuhkan korupsi:
gitk masih harus ditampilkan
svn/trunk
dalam leluhur master.Linearkan riwayat Anda di atas trunk:
Dan sekarang "git svn dcommit -n" akan memberi tahu Anda bahwa ia akan berkomitmen untuk trunk.
sumber
Buat direktori baru di repositori Subversion untuk proyek Anda.
Ubah ke proyek Anda yang dikelola Git dan inisialisasi git-svn.
Ini akan membuat satu komit karena direktori proyek SVN Anda masih kosong. Sekarang rebase semua yang ada di komit itu,
git svn dcommit
dan Anda harus selesai. Ini akan sangat mengacaukan tanggal komit Anda.sumber
Git -> SVN dengan riwayat komit lengkap
Saya punya proyek Git dan harus memindahkannya ke SVN. Ini adalah bagaimana saya membuatnya, menjaga seluruh sejarah komit. Satu-satunya hal yang hilang adalah waktu komit asli karena libSVN akan mengatur waktu setempat ketika kita melakukannya
git svn dcommit
.Howto:
Memiliki repositori SVN tempat kami ingin mengimpor barang-barang kami dan mengkloningnya dengan git-svn:
Pergi kesana:
Tambahkan remote dari repositori Git (dalam contoh ini saya menggunakan C: /Projects /repo.git ). Anda ingin mendorong ke SVN dan memberinya nama old-git:
Ambil informasi dari cabang master dari repositori old-git ke repositori saat ini:
Periksa cabang master dari remote lama-git ke cabang baru bernama lama dalam repositori saat ini:
Rebase untuk meletakkan HEAD di atas old-git / master. Ini akan mempertahankan semua komitmen Anda. Apa yang dilakukan ini pada dasarnya adalah mengambil semua pekerjaan Anda di Git dan meletakkannya di atas pekerjaan yang Anda akses dari SVN.
Sekarang kembali ke cabang utama Anda:
Dan Anda dapat melihat bahwa Anda memiliki riwayat commit yang bersih. Ini yang ingin Anda dorong ke SVN.
Dorong pekerjaan Anda ke SVN:
Itu saja. Ini sangat bersih, tidak ada peretasan, dan semuanya berfungsi dengan baik di luar kotak. Nikmati.
sumber
git svn
persiapan diperlukan.Saya akan mengusulkan instruksi yang sangat singkat dalam 4 perintah menggunakan SubGit . Lihat posting ini untuk detailnya.
sumber
Saya perlu melakukan repositori Git saya yang ada ke repositori SVN kosong.
Beginilah cara saya melakukan ini:
Itu bekerja tanpa masalah. Saya harap ini membantu seseorang.
Karena saya harus mengotorisasi sendiri dengan nama pengguna yang berbeda ke repositori SVN (saya
origin
menggunakan otentikasi kunci publik / pribadi), saya harus menggunakan--username
properti.sumber
git-svn
sebelum ini memungkinkan, lihat stackoverflow.com/questions/527037/git-svn-not-a-git-commandJika Anda ingin terus bekerja dengan Git sebagai repositori utama Anda dan hanya perlu "mengekspor" revisi ke SVN dari waktu ke waktu, Anda bisa menggunakan Penjahit untuk menjaga repositori SVN tetap sinkron. Itu dapat menyalin revisi antara sistem kontrol sumber yang berbeda dan akan memperbarui SVN dengan perubahan yang Anda buat di Git.
Saya belum mencoba konversi Git-ke-SVN, tetapi untuk SVN -> contoh SVN lihat jawaban ini .
sumber
Namun urutan lain yang berhasil (dengan beberapa komentar pada setiap langkah):
Instal
git-svn
dansubversion
toolkit:Beralih di dalam
PROJECT_FOLDER
Buat jalur proyek di server Subversion (sayangnya
git-svn
plugin saat ini memiliki cacat dibandingkan dengan TortoiseSVN). Tidak dapat menyimpan kode sumber langsung kePROJECT_FOLDER
. Sebagai gantinya, secara default, itu akan mengunggah semua kode kePROJECT_FOLDER/trunk
.svn mkdir - protokol orang tua: /// path / ke / repo / PROJECT_FOLDER / trunk -m "membuat git repo placeholder"
Ini adalah tempat
trunk
di mana ujung jalan adalah wajibInisialisasi
git-svn
konteks plugin di dalam.git
folderIni adalah tempat
trunk
di mana pada ujung jalan tidak perluAmbil
Subversion
informasi repositori kosongLangkah ini membantu menyinkronkan server Subversion dengan
git-svn
plugin. Ini adalah saat ketikagit-svn
plugin menetapkanremotes/origin
path dan menghubungkannya dengantrunk
subfolder di sisi server.Rebase komitmen Git lama terjadi sebelum
git-svn
plugin terlibat dalam proses (langkah ini opsional )Tambahkan file baru / yang dimodifikasi untuk dikomit (langkah ini biasa untuk aktivitas Git dan opsional )
Komit file yang baru ditambahkan ke dalam repositori Git lokal (langkah ini opsional dan hanya berlaku jika langkah 7 telah digunakan):
Mendorong semua proyek mengubah sejarah ke server Subversion:
sumber
Anda dapat membuat repositori SVN baru. Ekspor proyek Git Anda (menyempurnakan file .git). Tambahkan ke repositori SVN (menginisialisasi repositori dengan apa yang Anda miliki sejauh ini di Git). Kemudian gunakan instruksi untuk mengimpor repositori SVN dalam proyek Git yang baru.
Tapi ini akan kehilangan riwayat Git Anda sebelumnya.
sumber
Jika Anda tidak harus menggunakan SVN tertentu dan Anda menggunakan GitHub, Anda dapat menggunakan konektor SVN mereka.
Informasi lebih lanjut ada di sini: Berkolaborasi dalam GitHub dengan Subversion
sumber
Saya ingin berbagi alat hebat yang digunakan di komunitas WordPress bernama Scatter
Git plugin WordPress dan sedikit pencaritas kewarasan
Ini memungkinkan pengguna untuk dapat mengirim repositori Git mereka ke wordpress.org SVN secara otomatis. Secara teori, kode ini dapat diterapkan ke repositori SVN.
sumber
Saya baru-baru ini harus memigrasi beberapa repositori Git ke SVN, dan setelah mencoba semua solusi yang bisa saya temukan, yang akhirnya berhasil bagi saya adalah Mercurial (ya, menggunakan VCS ketiga ). Dengan menggunakan panduan ini , saya membuat proses berikut (di Linux, tetapi ide dasarnya juga bisa digunakan di Windows).
Paket yang diperlukan:
Mercurial perlu dikonfigurasi dengan menambahkan yang berikut ke
~/.hgrc
:Buat beberapa direktori kerja sementara (saya memiliki beberapa repositori untuk dimigrasi sehingga saya membuat direktori untuk versi SVN dan Git, untuk membuatnya terpisah):
Buat repositori lokal SVN yang kosong:
Klon repositori Git yang ada:
Biarkan Mercurial melakukan tugasnya:
Sekarang repositori SVN harus berisi histori komit penuh, tetapi tidak dengan cap waktu asli. Jika ini bukan masalah, lewati bagian selanjutnya ke langkah 11.
Dengan sedikit kerja, tanggal dan waktu setiap komit dapat diubah . Karena repositori saya cukup kecil, itu layak bagi saya untuk melakukannya secara manual. Pertama, buat
pre-revprop-change
kait di repositori SVN dengan konten berikut, untuk memungkinkan properti yang perlu diubah:Script ini harus dapat dieksekusi:
Mercurial membuat salinan repositori SVN yang berfungsi, bernama project -wc, jadi beralihlah ke sana dan edit waktu komit:
Masukkan tanggal dan waktu yang benar (perhatikan zona waktu!) Dan simpan. Anda harus mendapatkan pesan yang mengatakan "Tetapkan nilai baru untuk properti svn: tanggal revisi 1".
Sekarang bilas dan ulangi untuk setiap revisi lainnya.
Opsional memeriksa riwayat komit untuk memastikan semuanya terlihat OK:
Kemudian naik kembali satu tingkat:
Buang repositori:
Dan muat dump di server Subversion Anda. Selesai!
Proses ini mungkin juga akan bekerja secara langsung antara repositori jarak jauh, tetapi saya merasa lebih mudah untuk bekerja dengan yang lokal. Memperbaiki waktu komit adalah banyak pekerjaan, tetapi secara keseluruhan prosesnya jauh lebih mudah daripada metode lain yang saya temukan.
sumber
ada tiga metode:
rebase : sebagai jawaban lain
komit id: cari svn id komit pertama dan git komit id pertama, gema ke git / info / graft:
echo "git_id svn_id}" > .git/info/grafts
kemudiangit svn dcommit
checkout setiap git commit, salin file ke svn_repo, svn commit
bash demo : demo github
v1.x : gunakan rebase dan lakukan id
v2.x: gunakan salin file, lalu svn commit
sumber
Dalam kasus saya, saya harus memulai proyek bersih dari SVN
tambahkan semua sumber proyek Anda ...
sumber
Saya hanya ingin berbagi pengalaman saya dengan jawaban yang diterima. Saya melakukan semua langkah dan semuanya baik-baik saja sebelum saya menjalankan langkah terakhir:
Saya menemukan utas https://github.com/nirvdrum/svn2git/issues/50 dan akhirnya solusi yang saya terapkan dalam file berikut di baris 101 /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm
Saya diganti
dengan
Ini memperbaiki masalah saya.
sumber
Bagaimana jika Anda tidak ingin melakukan setiap commit yang Anda buat di Git, ke repositori SVN? Bagaimana jika Anda hanya ingin mengirim komit secara selektif? Saya punya solusi yang lebih baik.
Saya menyimpan satu repositori Git lokal di mana yang saya lakukan hanyalah mengambil dan menggabungkan dari SVN. Dengan begitu saya dapat memastikan bahwa saya memasukkan semua perubahan yang sama dengan SVN, tetapi saya menjaga sejarah komit saya terpisah dari SVN sepenuhnya.
Kemudian saya menyimpan copy pekerjaan lokal SVN terpisah yang ada di folder terpisah. Itu yang saya buat komit kembali ke SVN, dan saya hanya menggunakan utilitas baris perintah SVN untuk itu.
Ketika saya siap untuk mengkomit keadaan repositori Git lokal saya ke SVN, saya cukup menyalin seluruh kekacauan file ke copy pekerjaan SVN lokal dan mengkomitnya dari sana menggunakan SVN daripada Git.
Dengan cara ini saya tidak perlu melakukan rebasing, karena rebasing seperti freebasing.
sumber