Pertanyaan Bagaimana cara memigrasi penyimpanan SVN dengan riwayat ke repositori Git baru?


Saya membaca manual Git, FAQ, Git - SVN kursus kilat, dll. Dan mereka semua menjelaskan ini dan itu, tetapi tidak ada yang bisa Anda temukan instruksi sederhana seperti:

Gudang SVN di: svn://myserver/path/to/svn/repos

Git repositori di: git://myserver/path/to/git/repos

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

Saya tidak berharap itu sesederhana itu, dan saya tidak berharap itu menjadi satu perintah. Tapi saya berharap tidak mencoba menjelaskan apa pun - hanya untuk mengatakan langkah-langkah apa yang harus diambil dengan memberi contoh ini.


1392
2017-09-17 02:08


asal


Jawaban:


Sihir:

$ git svn clone http://svn/repo/here/trunk

Git dan SVN beroperasi sangat berbeda. Anda perlu belajar Git, dan jika Anda ingin melacak perubahan dari hulu SVN, Anda perlu belajar git-svn. Itu git-svn halaman manual memiliki bagian contoh yang baik:

$ git svn --help

495
2017-09-17 18:20



Buat file pengguna (mis. users.txt) untuk memetakan pengguna SVN ke Git:

user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...

Anda dapat menggunakan liner satu ini untuk membuat template dari repositori SVN Anda yang sudah ada:

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt

SVN akan berhenti jika ia menemukan pengguna SVN yang hilang tidak ada dalam file. Tetapi setelah itu Anda dapat memperbarui file dan mengambil di mana Anda tinggalkan.

Sekarang tarik data SVN dari repositori:

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp

Perintah ini akan membuat repositori Git baru di dest_dir-tmp dan mulai menarik repositori SVN. Perhatikan bahwa tanda "--stdlayout" menyiratkan Anda memiliki tata letak "trunk /, branches /, tag /" umum SVN. Jika tata letak Anda berbeda, kenali --tags, --branches, --trunk opsi (secara umum git svn help).

Semua protokol umum diizinkan: svn://, http://, https://. URL harus menargetkan repositori dasar, sesuatu seperti http://svn.mycompany.com/myrepo/repository. Itu harus tidak termasuk /trunk, /tag atau /branches.

Perhatikan bahwa setelah menjalankan perintah ini sangat sering terlihat seperti operasi "menggantung / dibekukan", dan itu cukup normal yang dapat terjebak untuk waktu yang lama setelah menginisialisasi repositori baru. Akhirnya Anda akan melihat pesan log yang menunjukkan bahwa itu bermigrasi.

Juga perhatikan bahwa jika Anda menghilangkan --no-metadata bendera, Git akan menambahkan informasi tentang revisi SVN terkait ke pesan commit (yaitu git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>)

Jika nama pengguna tidak ditemukan, perbarui users.txt file kemudian:

cd dest_dir-tmp
git svn fetch

Anda mungkin harus mengulangi perintah terakhir beberapa kali, jika Anda memiliki proyek besar, hingga semua perintah Subversion diambil:

git svn fetch

Ketika selesai, Git akan memeriksa SVN trunk menjadi cabang baru. Cabang lain disiapkan sebagai remote. Anda dapat melihat cabang SVN lainnya dengan:

git branch -r

Jika Anda ingin menyimpan cabang jarak jauh lainnya di repositori Anda, Anda ingin membuat cabang lokal untuk masing-masing secara manual. (Lewati trunk / master.) Jika Anda tidak melakukan ini, cabang tidak akan dikloning pada langkah terakhir.

git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name

Tag diimpor sebagai cabang. Anda harus membuat cabang lokal, membuat tag dan menghapus cabang untuk memilikinya sebagai tag di Git. Untuk melakukannya dengan tag "v1":

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

Mengkloning repositori GIT-SVN Anda ke dalam repositori Git yang bersih:

git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir

Cabang lokal yang Anda buat sebelumnya dari cabang jauh hanya akan disalin sebagai cabang jarak jauh ke dalam repositori kloning baru. (Lewati trunk / master.) Untuk setiap cabang yang ingin Anda pertahankan:

git checkout -b local_branch origin/remote_branch

Terakhir, hapus remote dari repositori Git bersih Anda yang mengarah ke repositori sementara yang sekarang dihapus:

git remote rm origin

1466
2017-09-17 17:09



Clean Migrate Your Subversion Repository Ke Git Repository. Pertama Anda harus membuat file yang memetakan nama pengarang komit Subversion Anda kepada komit Git, misalnya ~/authors.txt:

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>

Kemudian Anda dapat mengunduh data Subversion ke dalam repositori Git:

mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

Jika Anda menggunakan Mac, Anda bisa mendapatkannya git-svn dari MacPorts dengan menginstal git-core +svn.

Jika repositori subversi Anda berada di mesin yang sama dengan repositori git yang Anda inginkan, maka Anda dapat menggunakan sintaks ini untuk langkah init, jika tidak semua sama:

git svn init file:///home/user/repoName --no-metadata

183
2017-09-21 02:15



Saya menggunakan skrip svn2git dan berfungsi seperti jimat! https://github.com/nirvdrum/svn2git


67
2017-09-26 13:13



Saya menyarankan agar merasa nyaman dengan Git sebelum mencoba menggunakan git-svn secara terus-menerus, yaitu mempertahankan SVN sebagai repo terpusat dan menggunakan Git secara lokal.

Namun, untuk migrasi sederhana dengan semua riwayat, berikut adalah beberapa langkah sederhana:

Inisialisasi repo lokal:

mkdir project
cd project
git svn init http://svn.url

Tandai seberapa jauh Anda ingin mulai mengimpor revisi:

git svn fetch -r42

(atau hanya "git svn fetch" untuk semua revs)

Sebenarnya mengambil semuanya sejak saat itu:

git svn rebase

Anda dapat memeriksa hasil impor dengan Gitk. Saya tidak yakin apakah ini bekerja pada Windows, ia bekerja pada OSX dan Linux:

gitk

Ketika Anda mendapatkan SVN repo Anda dikloning secara lokal, Anda mungkin ingin mendorongnya ke repositori Git yang terpusat untuk kolaborasi yang lebih mudah.

Pertama buat repo jarak jauh kosong Anda (mungkin aktif GitHub?):

git remote add origin git@github.com:user/project-name.git

Kemudian, secara opsional sinkronkan cabang utama Anda sehingga operasi tarik akan secara otomatis menggabungkan master jarak jauh dengan master lokal Anda, ketika keduanya berisi hal-hal baru:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Setelah itu, Anda mungkin tertarik untuk mencoba sendiri git_remote_branch alat, yang membantu menangani cabang jarak jauh:

Posting penjelasan pertama: "Git cabang jarak jauh"

Tindak lanjut untuk versi terbaru: "Saatnya git berkolaborasi dengan git_remote_branch"


56



Ada solusi baru untuk kelancaran migrasi dari Subversion ke Git (atau untuk menggunakan keduanya secara bersamaan): SubGit (http://subgit.com/).

Saya sedang mengerjakan proyek ini sendiri. Kami menggunakan SubGit di repositori kami - beberapa rekan tim saya menggunakan Git dan beberapa Subversion dan sejauh ini bekerja dengan sangat baik.

Untuk bermigrasi dari Subversion ke Git dengan SubGit, Anda harus menjalankan:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

Setelah itu Anda akan mendapatkan repositori Git di svn_repos / .git dan dapat mengkloningnya, atau hanya terus menggunakan Subversion dan repositori Git baru ini bersama-sama: SubGit akan memastikan bahwa keduanya selalu disinkronkan.

Jika repositori Subversion Anda berisi beberapa proyek, maka beberapa repositori Git akan dibuat dalam direktori svn_repos / git. Untuk menyesuaikan terjemahan sebelum menjalankannya, lakukan hal berikut:

$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos

Dengan SubGit Anda dapat bermigrasi ke Git murni (bukan git-svn) dan mulai menggunakannya sambil tetap menyimpan Subversion selama Anda membutuhkannya (untuk alat build yang sudah dikonfigurasi, misalnya).

Semoga ini membantu!


29



Lihat pejabatnya git-svn manpage. Secara khusus, lihat di bawah "Contoh Dasar":

Melacak dan berkontribusi untuk keseluruhan proyek yang dikelola Subversion (selesai)       dengan batang, tag dan cabang):

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags

16



Pro Git 8.2 menjelaskannya: http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git


14



SubGit (vs Blue Screen of Death)

subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

Itu semua.

+ Untuk memperbarui dari SVN, repositori Git yang dibuat oleh perintah pertama.

subgit import  directory/path/Local.git.Repo

Saya menggunakan cara untuk bermigrasi ke Git langsung untuk repositori besar.
Tentu saja Anda perlu persiapan.
Tetapi Anda mungkin tidak menghentikan proses pengembangan, sama sekali.

Ini caraku.

Solusi saya terlihat seperti:

  • Migrasi SVN ke repositori Git
  • Perbarui repositori Git tepat sebelum tim beralih ke.

Migrasi membutuhkan banyak waktu untuk repositori SVN yang besar.
Tetapi memperbarui migrasi selesai hanya detik.

Tentu saja saya gunakan SubGit, mama. git-svn membuatku Blue Screen of Death. Terus saja. Dan git-svn membuatku bosan dengan Git's "nama file terlalu panjang" kesalahan fatal.

TANGGA

1  Unduh SubGit

2 Mempersiapkan perintah migrasi dan pembaruan.

Katakanlah kita melakukannya untuk Windows (itu sepele ke port ke Linux).
Dalam instalasi SubGit tempat sampah direktori (subgit-2.X.X \ bin), buat dua file .bat.

Isi file / perintah untuk migrasi:

start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

Perintah "start" adalah opsional di sini (Windows). Ini akan memungkinkan untuk melihat kesalahan pada awal dan meninggalkan shell terbuka setelah selesainya SubGit.

Anda dapat menambahkan di sini parameter tambahan mirip dengan git-svn. Saya hanya menggunakan --default-domain myCompanyDomain.com untuk memperbaiki domain dari alamat email penulis SVN.
Saya memiliki struktur repositori SVN standar (trunk / branch / tags) dan kami tidak memiliki masalah dengan "pemetaan penulis". Jadi saya tidak melakukan apa-apa lagi.

(Jika Anda ingin memigrasikan tag seperti cabang atau SVN Anda memiliki banyak cabang / folder tag, Anda dapat mempertimbangkan untuk menggunakan SubBit yang lebih verbose pendekatan)

Kiat 1: Gunakan - revisi ulang YourSvnRevNumber untuk melihat dengan cepat bagaimana hal-hal mendidih (semacam debugging). Terutama berguna untuk melihat nama atau email penulis yang telah diperbaiki.
Atau untuk membatasi kedalaman histori migrasi.

Kiat 2: Migrasi dapat terganggu (Ctrl + C) dan dipulihkan dengan menjalankan perintah / file pembaruan berikutnya.
Saya tidak menyarankan melakukan ini untuk repositori besar. Saya telah menerima "Out of memory Java + Windows exception".

Kiat 3: Lebih baik membuat salinan hasil gudang kosong Anda.

Isi file / perintah untuk memperbarui:

start    subgit import  directory/path/Local.git.Repo

Anda dapat menjalankannya berapa kali ketika Anda ingin mendapatkan komitmen tim terakhir untuk repositori Git Anda.

PERINGATAN! Jangan sentuh repositori telanjang Anda (pembuatan cabang misalnya).
Anda akan menerima kesalahan fatal berikutnya:

Kesalahan yang tidak dapat dipulihkan: tidak disinkronkan dan tidak dapat disinkronkan ... Menerjemahkan revisi Subversion ke Git berkomitmen ...

3 Jalankan perintah / file pertama. Butuh waktu sangat lama untuk repositori besar. 30 jam untuk repositori saya yang sederhana.

Itu semua.
Anda dapat memperbarui repositori Git Anda dari SVN kapan saja berapa kali dengan menjalankan file / perintah kedua. Dan sebelum beralih dari tim pengembangan Anda ke Git.
Hanya butuh beberapa detik.



Ada satu lagi tugas yang bermanfaat.

Dorong repositori Git lokal Anda ke repositori Git jarak jauh

Apakah ini kasusmu? Mari kita lanjutkan.

  1. Konfigurasikan remote Anda

Menjalankan:

$ git remote add origin url://your/repo.git
  1. Bersiaplah untuk mengirim awal repositori Git lokal Anda yang besar ke repositori jarak jauh

Secara default, Git Anda tidak dapat mengirim potongan besar. fatal: Remote end menggantung secara tak terduga

Mari kita jalankan untuk itu:

git config --global http.postBuffer 1073741824

524288000 - 500 MB 1073741824 - 1 GB, dll.

Perbaiki lokal Anda masalah sertifikat. Jika server git Anda menggunakan sertifikat yang rusak.

Saya telah dinonaktifkan sertifikat.

Juga server Git Anda mungkin memiliki meminta batasan jumlah yang perlu dikoreksi.

  1. Dorong semua migrasi ke repositori Git remote tim.

Jalankan dengan Git lokal:

git push origin --mirror

(git push origin '*: *' untuk versi Git lama)

Jika Anda mendapatkan yang berikut: kesalahan: tidak dapat menelurkan git: Tidak ada file atau direktori semacam itu... Bagi saya rekreasi penuh repositori saya memecahkan kesalahan ini (30 jam). Anda dapat mencoba perintah selanjutnya

git push origin --all
git push origin --tags

Atau coba instal ulang Git (tidak berguna bagi saya). Atau Anda dapat membuat cabang dari semua yang Anda tandai dan dorong. Atau, atau, atau ...


12



reposurgeon

Untuk kasus yang rumit, reposurgeon oleh Eric S. Raymond adalah alat pilihan. Selain SVN, ia mendukung banyak sistem kontrol versi lainnya melalui fast-export format, dan juga CVS. Penulis melaporkan konversi yang berhasil dari repositori kuno seperti Emacs dan FreeBSD.

Alat itu rupanya bertujuan mendekati konversi sempurna (seperti mengubah SVN svn:ignore properti ke .gitignore file) bahkan untuk layout repositori yang sulit dengan sejarah panjang. Untuk banyak kasus, alat lain mungkin lebih mudah digunakan.

Sebelum menyelidiki dokumentasi reposurgeon baris perintah, pastikan untuk membaca yang sangat baik Panduan migrasi DVCS yang melewati proses konversi selangkah demi selangkah.


8