it-swarm-id.com

Bagaimana cara saya memigrasi repositori SVN dengan histori ke repositori Git yang baru?

Saya membaca manual Git, FAQ, Git - kursus kilat SVN, dll. Dan mereka semua menjelaskan ini dan itu, tetapi tidak ada tempat Anda dapat menemukan 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 itu tidak mencoba menjelaskan apa pun - hanya mengatakan langkah apa yang harus diambil dengan memberikan contoh ini.

1453
Milan Babuškov

Sihir:

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

Git dan SVN beroperasi sangat berbeda. Anda perlu mempelajari Git, dan jika Anda ingin melacak perubahan dari SVN hulu, Anda perlu mempelajari git-svn. Halaman manual git-svn memiliki bagian contoh yang bagus:

$ git svn --help
513
jfm3

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

user1 = First Last Name <[email protected]>
user2 = First Last Name <[email protected]>
...

Anda bisa menggunakan one-liner ini untuk membangun templat dari repositori SVN yang ada:

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

SVN akan berhenti jika 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 bendera "--stdlayout" menyiratkan Anda memiliki tata letak "trunk /, branch /, tag /" SVN yang umum. Jika tata letak Anda berbeda, kenali opsi --tags, --branches, --trunk (secara umum git svn help).

Semua protokol umum diizinkan: svn://, http://, https://. URL harus menargetkan repositori dasar, 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 "hang/freezed", dan itu cukup normal bahwa itu dapat macet untuk waktu yang lama setelah menginisialisasi repositori baru. Akhirnya Anda akan melihat pesan log yang menunjukkan bahwa itu sedang dimigrasi.

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

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

cd dest_dir-tmp
git svn fetch

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

git svn fetch

Ketika selesai, Git akan checkout SVN trunk ke cabang baru. Cabang-cabang lain diatur 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 menjadikannya 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

Kloning repositori GIT-SVN Anda ke 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 jarak jauh hanya akan disalin sebagai cabang jarak jauh ke repositori hasil 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 menunjuk ke repositori sementara yang sekarang dihapus:

git remote rm Origin
1512
cmcginty

Migrasikan Repositori Subversi Anda ke Repositori Git . Pertama, Anda harus membuat file yang memetakan nama pembuat komit Subversion Anda ke komit Git, katakan ~/authors.txt:

jmaddox = Jon Maddox <[email protected]>
bigpappa = Brian Biggs <[email protected]>

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 mendapatkan git-svn dari MacPorts dengan menginstal git-core +svn.

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

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

Saya menggunakan skrip svn2git dan bekerja seperti mantra.

69

Saya menyarankan untuk merasa nyaman dengan Git sebelum mencoba menggunakan git-svn terus-menerus, yaitu menjaga 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 itu:

git svn rebase

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

gitk

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

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

git remote add Origin [email protected]:user/project-name.git

Kemudian, secara opsional sinkronkan cabang utama Anda sehingga operasi tarikan 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 alat git_remote_branch saya sendiri, yang membantu menangani cabang-cabang jarak jauh:

Posting penjelasan pertama: " Git cabang jauh "

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

57
webmat

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

Saya sedang mengerjakan proyek ini sendiri. Kami menggunakan SubGit dalam repositori kami - beberapa rekan tim saya menggunakan Git dan beberapa Subversi dan sejauh ini berfungsi dengan sangat baik.

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

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

Setelah itu Anda akan mendapatkan repositori Git di svn_repos/.git dan dapat mengkloningnya, atau teruskan menggunakan Subversion dan repositori Git baru ini secara bersamaan: SubGit akan memastikan bahwa keduanya selalu tetap sinkron.

Jika repositori Subversion Anda berisi beberapa proyek, maka beberapa repositori Git akan dibuat di 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 Subversi selama Anda membutuhkannya (misalnya, untuk alat pembuatan yang sudah dikonfigurasi, misalnya).

Semoga ini membantu!

30
Alexander Kitaev

Lihat halaman resmi git-svn . Secara khusus, lihat di bawah "Contoh Dasar":

Melacak dan berkontribusi ke seluruh proyek yang dikelola Subversion (lengkap dengan trunk, tag, dan cabang):

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

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 dibuat oleh perintah pertama.

subgit import  directory/path/Local.git.Repo

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

Ini jalan saya.

Solusi saya terlihat seperti:

  • Migrasikan SVN ke repositori Git
  • Perbarui repositori Git sesaat sebelum tim beralih ke .

Migrasi membutuhkan banyak waktu untuk repositori SVN besar.
Tetapi pembaruan migrasi yang telah selesai hanya beberapa detik.

Tentu saja saya menggunakan SubGit , mama. git-svn membuat saya Blue Screen of Death . Terus-menerus. Dan git-svn membuat saya bosan dengan kesalahan fatal " nama file terlalu lama ".

LANGKAH

1. nduh SubGit

2. Mempersiapkan migrasi dan memperbarui perintah.

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

Konten file/perintah untuk migrasi:

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

Perintah "mulai" adalah opsional di sini (Windows). Ini akan memungkinkan untuk melihat kesalahan saat memulai dan membiarkan Shell dibuka setelah SubGit selesai.

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/tag) dan kami tidak memiliki masalah dengan "pemetaan penulis". Jadi saya tidak melakukan apa-apa lagi.

(Jika Anda ingin melakukan migrasi tag seperti cabang atau SVN Anda memiliki beberapa cabang/folder tag, Anda dapat mempertimbangkan untuk menggunakan SubGit yang lebih verbose pendekatan )

Kiat 1 : Gunakan --minimal-revisi YourSvnRevNumber untuk melihat dengan cepat bagaimana hal-hal mendidih (semacam debugging). Yang sangat berguna adalah untuk melihat nama atau email penulis yang diselesaikan.
Atau untuk membatasi kedalaman riwayat migrasi.

Kiat 2 : Migrasi dapat terputus (Ctrl + C) dan dikembalikan dengan menjalankan perintah/file pembaruan berikutnya.
Saya tidak menyarankan melakukan ini untuk repositori besar. Saya telah menerima "Kehabisan memori Java + Windows exception".

Kiat 3 : Lebih baik membuat salinan dari repositori telanjang hasil Anda.

Konten file/perintah untuk memperbarui:

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

Anda dapat menjalankannya berapapun kali ketika Anda ingin mendapatkan komitmen tim terakhir ke repositori Git Anda.

Peringatan! Jangan menyentuh gudang telanjang Anda (misalnya penciptaan cabang).
Anda akan mengambil kesalahan fatal berikutnya:

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

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

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



Ada satu tugas lagi yang bermanfaat.

Dorong repositori Git lokal Anda ke repositori Git jarak jauh

Apakah ini kasus Anda? Mari kita lanjutkan.

  1. Konfigurasikan remote Anda

Menjalankan:

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

Secara default, Git Anda tidak dapat mengirim potongan besar. fatal: Ujung jarak jauh menutup 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 git-server Anda menggunakan sertifikat yang rusak.

Saya telah menonaktifkan sertifikat .

Juga server Git Anda mungkin memiliki batasan jumlah permintaan perlu diperbaiki .

  1. Dorong semua migrasi ke repositori Git jarak jauh 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 ... Bagi saya rekreasi penuh dari repositori saya menyelesaikan 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 tag Anda dan Dorong mereka. Atau, atau, ...

13
it3xl

reposurgeon

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

Alat ini rupanya bertujuan untuk konversi yang hampir sempurna (seperti mengonversi properti svn:ignore SVN ke file .gitignore) bahkan untuk tata letak repositori yang sulit dengan sejarah panjang. Untuk banyak kasus, alat lain mungkin lebih mudah digunakan.

Sebelum mempelajari dokumentasi baris perintah reposurgeon, pastikan untuk membaca panduan migrasi DVCS yang luar biasa yang membahas proses konversi langkah demi langkah.

9
krlmlr

Panduan ini di situs web atlassian adalah salah satu yang terbaik yang saya temukan:

https://www.atlassian.com/git/migration

Alat ini - https://bitbucket.org/atlassian/svn-migration-scripts - juga sangat berguna untuk menghasilkan author.txt Anda di antara hal-hal lain.

7
Andrew B

Anda harus Instal

git
git-svn

Disalin dari tautan ini http://john.albin.net/git/convert-Subversion-to-git .

1. Ambil daftar semua pengalih Subversion

Subversi cukup mencantumkan nama pengguna untuk setiap komit. Komit Git memiliki banyak data yang lebih kaya, tetapi yang paling sederhana, pembuat komit perlu memiliki nama dan email yang terdaftar. Secara default alat git-svn hanya akan mencantumkan nama pengguna SVN di bidang penulis dan surel. Tetapi dengan sedikit kerja, Anda dapat membuat daftar semua pengguna SVN dan apa nama dan email Git yang sesuai. Daftar ini dapat digunakan oleh git-svn untuk mengubah nama pengguna svn polos menjadi commiter Git yang tepat.

Dari akar checkout Subversion lokal Anda, jalankan perintah ini:

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

Itu akan mengambil semua pesan log, mencabut nama pengguna, menghilangkan setiap nama pengguna duplikat, mengurutkan nama pengguna dan menempatkannya ke dalam file "penulis-transform.txt". Sekarang edit setiap baris dalam file. Misalnya, konversi:

jwilkins = jwilkins <jwilkins>

dalam hal ini:

jwilkins = John Albin Wilkins <[email protected]>

2. Mengkloning repositori Subversion menggunakan git-svn

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

Ini akan melakukan transformasi git-svn standar (menggunakan file author-transform.txt yang Anda buat pada langkah 1) dan menempatkan repositori git di folder “~/temp” di dalam direktori home Anda.

3. Konversi svn: abaikan properti menjadi .gitignore

Jika repo svn Anda menggunakan svn: abaikan properti, Anda dapat dengan mudah mengonversinya menjadi file .gitignore menggunakan:

cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

4. Dorong repositori ke repositori kosong

Pertama, buat repositori kosong dan buat pencocokan cabang default dengan nama cabang "trunk".

git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk

Kemudian Dorong repositori temp ke repositori kosong yang baru.

cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.Push 'refs/remotes/*:refs/heads/*'
git Push bare

Anda sekarang dapat menghapus repositori ~/temp dengan aman.

5. Ubah nama cabang "trunk" menjadi "master"

Cabang pengembangan utama Anda akan diberi nama "trunk" yang cocok dengan nama di Subversion. Anda ingin menamainya menjadi cabang "master" standar Git menggunakan:

cd ~/new-bare.git
git branch -m trunk master

6. Bersihkan cabang dan tag

git-svn membuat semua tag Subversi menjadi cabang yang sangat pendek di Git dari bentuk "tag/nama". Anda ingin mengonversi semua cabang tersebut menjadi tag Git aktual menggunakan:

cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done

Langkah ini akan membutuhkan sedikit pengetikan. :-) Tapi, jangan khawatir; unix Shell Anda akan memberikan> Prompt sekunder untuk perintah ekstra panjang yang dimulai dengan git untuk-masing-masing ref.

7
Valarpirai

Jawaban yang agak panjang hanya menggunakan git, SVN, dan bash. Ini termasuk langkah-langkah untuk repositori SVN yang tidak menggunakan tata letak konvensional dengan tata letak direktori trunk/cabang/tag (SVN sama sekali tidak melakukan apa pun untuk menegakkan tata letak semacam ini).

Pertama-tama gunakan skrip bash ini untuk memindai repo SVN Anda untuk orang-orang berbeda yang berkontribusi dan membuat templat untuk file pemetaan:

#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
  echo "${author} = NAME <[email protected]>";
done

Gunakan ini untuk membuat file authors di mana Anda memetakan nama pengguna svn ke nama pengguna dan email yang ditetapkan oleh pengembang Anda menggunakan git config properties user.name dan user.email (perhatikan bahwa untuk layanan seperti GitHub hanya cukup memiliki email yang cocok).

Kemudian minta git svn klon repositori svn ke repositori git, ceritakan tentang pemetaan:

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

Ini bisa memakan waktu sangat lama, karena git svn akan memeriksa setiap revisi untuk setiap tag atau cabang yang ada. (perhatikan bahwa tag di SVN hanya benar-benar cabang, sehingga berakhir seperti itu di Git). Anda dapat mempercepat ini dengan menghapus tag dan cabang lama di SVN yang tidak Anda butuhkan.

Menjalankan ini di server di jaringan yang sama atau di server yang sama juga dapat mempercepat ini. Juga, jika karena alasan tertentu proses ini terganggu Anda bisa melanjutkan menggunakan

git svn rebase --continue

Dalam banyak kasus Anda selesai di sini. Tetapi jika repo SVN Anda memiliki tata letak yang tidak konvensional di mana Anda hanya memiliki direktori di SVN yang ingin Anda masukkan ke dalam cabang git, Anda dapat melakukan beberapa langkah tambahan.

Yang paling sederhana adalah dengan hanya membuat repo SVN baru di server Anda yang mengikuti konvensi dan menggunakan svn copy untuk meletakkan direktori Anda di trunk atau cabang. Ini mungkin satu-satunya cara jika direktori Anda berada di akar repo, ketika saya terakhir mencoba ini git svn hanya menolak untuk melakukan checkout.

Anda juga dapat melakukan ini menggunakan git. Untuk git svn clone cukup gunakan direktori yang ingin Anda masukkan ke dalam cabang git.

Setelah lari

git branch --set-upstream master git-svn
git svn rebase

Perhatikan bahwa ini membutuhkan Git 1.7 atau lebih tinggi.

6
thoutbeckers

GitHub sekarang memiliki fitur untuk mengimpor dari repositori SVN . Saya tidak pernah mencobanya.

6
webmat

Saya telah memposting panduan langkah demi langkah ( sini ) untuk mengonversi svn ke git termasuk mengonversi tag svn ke git tag dan svn cabang ke git branch.

Versi pendek:

1) mengkloning svn dari nomor revisi tertentu. (nomor revisi harus yang tertua yang ingin Anda migrasikan)

git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame

2) mengambil data svn. Langkah ini yang paling memakan waktu.

cd gitreponame
git svn fetch

ulangi git svn fetch sampai selesai tanpa kesalahan

3) perbarui cabang utama

git svn rebase

4) Buat cabang lokal dari cabang svn dengan menyalin referensi

cp .git/refs/remotes/Origin/* .git/refs/heads/

5) konversi svn tag menjadi git tag

git for-each-ref refs/remotes/Origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/Origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done

6) Letakkan repositori di tempat yang lebih baik seperti github

git remotes add newrepo [email protected]:aUser/aProjectName.git
git Push newrepo refs/heads/*
git Push --tags newrepo

Jika Anda ingin lebih detail, baca post atau tanyakan kepada saya.

5

Kita dapat menggunakan perintah git svn clone seperti di bawah ini.

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

Perintah di atas akan membuat file penulis dari komit SVN.

  • svn log --stop-on-copy <SVN_URL>

Perintah di atas akan memberi Anda nomor revisi pertama ketika proyek SVN Anda dibuat.

  • git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>

Perintah di atas akan membuat repositori Git di lokal.

Masalahnya adalah itu tidak akan mengkonversi cabang dan tag ke Push. Anda harus melakukannya secara manual. Misalnya di bawah ini untuk cabang:

$ git remote add Origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
* master
  remotes/Origin/MyDevBranch
  remotes/Origin/tags/MyDevBranch-1.0
  remotes/Origin/trunk
$$ git checkout -b MyDevBranch Origin/MyDevBranch
Branch MyDevBranch set up to track remote branch MyDevBranch from Origin.
Switched to a new branch 'MyDevBranch'
$ git branch -a
* MyDevBranch
  master
  remotes/Origin/MyDevBranch
  remotes/Origin/tags/MyDevBranch-1.0
  remotes/Origin/trunk
$

Untuk tag:

$git checkout Origin/tags/MyDevBranch-1.0
Note: checking out 'Origin/tags/MyDevBranch-1.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 3041d81... Creating a tag
$ git branch -a
* (detached from Origin/tags/MyDevBranch-1.0)
  MyDevBranch
  master
  remotes/Origin/MyDevBranch
  remotes/Origin/tags/MyDevBranch-1.0
  remotes/Origin/trunk
$ git tag -a MyDevBranch-1.0 -m "creating tag"
$git tag
MyDevBranch-1.0
$

Sekarang Dorong master, cabang dan tag ke repositori git jarak jauh.

$ git Push Origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
 * [new branch]      master -> master
 * [new branch]      MyDevBranch -> MyDevBranch
 * [new tag]         MyDevBranch-1.0 -> MyDevBranch-1.0
$

utilitas svn2git

Utilitas svn2git menghapus upaya manual dengan cabang dan tag.

Instal menggunakan perintah Sudo gem install svn2git. Setelah itu jalankan perintah di bawah ini.

  • $ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>

Sekarang Anda dapat membuat daftar cabang, tag, dan Dorong dengan mudah.

$ git remote add Origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
  MyDevBranch
* master
  remotes/svn/MyDevBranch
  remotes/svn/trunk
$ git tag
  MyDevBranch-1.0
$ git Push Origin master MyDevBranch MyDevBranch-1.0

Bayangkan Anda memiliki 20 cabang dan tag, jelas svn2git akan menghemat banyak waktu dan itu sebabnya saya lebih suka daripada perintah asli. Ini pembungkus yang bagus di sekitar perintah git svn clone asli.

Untuk contoh lengkap, lihat entri blog saya.

5
Pankaj

TortoiseGit melakukan ini. lihat posting blog ini: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients

Ya, saya tahu menjawab dengan tautan tidak bagus, tetapi itu solusi, eh?

4
CAD bloke

Untuk GitLab pengguna Saya telah memasang inti tentang bagaimana saya bermigrasi dari SVN di sini:

https://Gist.github.com/leftclickben/322b7a3042cbe97ed2af

Langkah-langkah untuk bermigrasi dari SVN ke GitLab

Mempersiapkan

  • SVN di-host di svn.domain.com.au.
  • SVN dapat diakses melalui http(protokol lain harus berfungsi).
  • GitLab di-host di git.domain.com.au dan:
    • Grup dibuat dengan namespace dev-team.
    • Setidaknya satu akun pengguna dibuat, ditambahkan ke grup, dan memiliki kunci SSH untuk akun yang digunakan untuk migrasi (tes menggunakan ssh [email protected]).
    • Proyek favourite-project dibuat di namespace dev-team.
  • File users.txt berisi detail pengguna yang relevan, satu pengguna per baris, dalam bentuk username = First Last <[email protected]>, di mana usernameadalah nama pengguna yang diberikan dalam log SVN. (Lihat tautan pertama di bagian Referensi untuk detail, khususnya jawaban oleh pengguna Casey).

Versi

  • Versi subversi 1.6.17 (r1128011)
  • git versi 1.9.1
  • GitLab versi 7.2.1 ff1633f
  • Server Ubuntu 14.04

Perintah

bash
git svn clone --stdlayout --no-metadata -A users.txt 
http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab [email protected]:dev-team/favourite-project.git
git Push --set-upstream gitlab master

Itu dia! Muat ulang halaman proyek di GitLab web UI dan Anda akan melihat semua komit dan file sekarang terdaftar.

Catatan

  • Jika ada pengguna yang tidak dikenal, perintah git svn clone akan berhenti, dalam hal ini, perbarui users.txt, cd favourite-project dan git svn fetch akan berlanjut dari tempat ia berhenti.
  • Diperlukan tata letak trunkname __-tagsname __-branchesuntuk repositori SVN.
  • URL SVN yang diberikan pada perintah git svn clone berhenti tepat di atas trunk/, tags/ dan branches/.
  • Perintah git svn clone menghasilkan banyak output, termasuk beberapa peringatan di bagian atas; Saya mengabaikan peringatan itu.
3
leftclickben

Jika Anda menggunakan SourceTree, Anda dapat melakukan ini langsung dari aplikasi. File Goto -> Baru/Klon lalu lakukan hal berikut:

  1. Masukkan URL SVN jarak jauh sebagai "Jalur/URL Sumber".
  2. Masukkan kredensial Anda saat diminta.
  3. Masukkan lokasi folder lokal sebagai "Jalur tujuan".
  4. Beri nama.
  5. Dalam opsi lanjutan pilih "Git" dari dropdown di "Buat repositori jenis lokal".
  6. Anda secara opsional dapat menentukan revisi untuk dikloning.
  7. Hit Klon.

Buka repo di SourceTree dan Anda akan melihat pesan komit Anda juga telah dimigrasi.

Sekarang pergi ke Repositori -> Pengaturan Repositori dan tambahkan detail repo jarak jauh yang baru. Hapus remote SVN jika Anda mau (saya melakukan ini melalui opsi "Edit File Config".

Dorong kode ke repo jarak jauh yang baru saat Anda siap dan kode bebas.

3
Craig Myles

Saya sangat merekomendasikan ini serangkaian screencasts pendek Saya baru saja menemukan. Penulis menuntun Anda melalui operasi dasar, dan menampilkan beberapa penggunaan yang lebih maju.

3
ripper234

Berikut ini adalah skrip Shell sederhana tanpa dependensi yang akan mengonversi satu atau lebih repositori SVN ke git dan Dorong mereka ke GitHub.

https://Gist.github.com/NathanSweet/7327535

Di sekitar 30 baris skrip: klon menggunakan git SVN, membuat file .gitignore dari SVN :: abaikan properti, dorong ke dalam repositori bare git, ganti nama SVN trunk menjadi master, ubah tag SVN menjadi git tag, dan dorong ke GitHub sambil menjaga tag.

Saya mengalami banyak rasa sakit untuk memindahkan selusin repositori SVN dari Google Code ke GitHub. Tidak membantu saya menggunakan Windows. Ruby adalah semua jenis rusak pada kotak Debian lama saya dan membuatnya bekerja di Windows adalah lelucon. Solusi lain gagal bekerja dengan jalur Cygwin. Bahkan ketika saya mendapatkan sesuatu yang berfungsi, saya tidak tahu bagaimana cara agar tag muncul di GitHub (rahasianya adalah --follow-tag).

Pada akhirnya saya membuat dua skrip pendek dan sederhana, dihubungkan di atas, dan itu bekerja dengan baik. Solusinya tidak perlu lebih rumit dari itu!

2
NateS

Sebagai samping lain, perintah git-simpanan adalah anugerah ketika mencoba git dengan komit git-svn.

Proses yang khas:

  1. atur git repo
  2. lakukan beberapa pekerjaan pada file yang berbeda
  3. memutuskan untuk memeriksa beberapa pekerjaan, menggunakan git
  4. putuskan untuk svn-dcommit
  5. dapatkan kesalahan "tidak dapat dikomit dengan indeks kotor".

Solusinya (membutuhkan git 1.5.3+):

git stash; git svn dcommit ; git stash apply
2
Gregg Lind

Saya menggunakan mesin windows dan membuat Batch kecil untuk mentransfer repo SVN dengan sejarah (tetapi tanpa cabang) ke repo GIT hanya dengan menelepon

transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo

Mungkin ada yang bisa menggunakannya. Itu menciptakan folder TMP memeriksa repo SVN di sana dengan git dan menambahkan Origin baru dan mendorongnya ... dan menghapus folder itu lagi.

@echo off 
SET FROM=%1 
SET TO=%2 
SET TMP=tmp_%random%

echo from:  %FROM% 
echo to:    %TO% 
echo tmp:   %TMP%

pause

git svn clone  --no-metadata --authors-file=users.txt %FROM% %TMP%  
cd %TMP% 
git remote add Origin %TO% 
git Push --set-upstream Origin master


cd .. 
echo delete %TMP% ... 
pause

rmdir /s /q %TMP%

Anda masih membutuhkan users.txt dengan pemetaan pengguna seperti

User1 = User One <[email protected]>
2
cljk

Saya hanya ingin menambahkan kontribusi saya ke komunitas Git. Saya menulis skrip bash sederhana yang mengotomatiskan impor penuh. Tidak seperti alat migrasi lainnya, alat ini bergantung pada git asli dan bukan jGit. Alat ini juga mendukung repositori dengan riwayat revisi besar dan atau gumpalan besar. Ini tersedia melalui github:

https://github.com/onepremise/SGMS

Skrip ini akan mengonversi proyek yang disimpan di SVN dengan format berikut:

/trunk
  /Project1
  /Project2
/branches
     /Project1
     /Project2
/tags
 /Project1
 /Project2

Skema ini juga populer dan didukung:

/Project1
     /trunk
     /branches
     /tags
/Project2
     /trunk
     /branches
     /tags

Setiap proyek akan disinkronkan dengan nama proyek:

Ex: ./migration https://svnurl.com/basepath project1

Jika Anda ingin mengonversi repo penuh menjadi lebih, gunakan sintaks berikut:

Ex: ./migration https://svnurl.com/basepath .
1
Jason Huntley

Ada berbagai metode untuk mencapai tujuan ini. Saya sudah mencoba beberapa dari mereka dan menemukan benar-benar bekerja dengan hanya git dan svn diinstal pada OS Windows.

Prasyarat:

  1. git di windows (Saya sudah menggunakan ini) https://git-scm.com/
  2. svn dengan alat konsol terpasang (Saya telah menggunakan tortoise svn)
  3. File Dump dari gudang SVN Anda. svnadmin dump /path/to/repository > repo_name.svn_dump

Langkah-langkah untuk mencapai tujuan akhir (pindahkan semua repositori dengan sejarah ke git, pertama git lokal, lalu jauh)

  1. Buat repositori kosong (menggunakan alat konsol atau tortoiseSVN) di direktori REPO_NAME_FOLDER cd REPO_NAME_PARENT_FOLDER, masukkan dumpfile.dump ke REPO_NAME_PARENT_FOLDER

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump Tunggu operasi ini, mungkin lama

  3. Perintah ini diam, jadi buka jendela cmd kedua: svnserve -d -R --root REPO_NAME_FOLDER Mengapa tidak hanya menggunakan file: /// ......? Karena perintah selanjutnya akan gagal dengan Unable to open ... to URL:, berkat jawaban https://stackoverflow.com/a/6300968/4953065

  4. Buat folder baru SOURCE_GIT_FOLDER

  5. cd SOURCE_GIT_FOLDER
  6. git svn clone svn: // localhost/Tunggu operasi ini.

Akhirnya, apa yang kita dapat?

Mari kita periksa gudang lokal kami:

git log

Lihat komit Anda sebelumnya? Jika ya - baiklah

Jadi sekarang Anda memiliki repositori git lokal yang berfungsi penuh dengan sumber dan riwayat svn lama Anda. Sekarang, jika Anda ingin memindahkannya ke beberapa server, gunakan perintah berikut:

git remote add Origin https://fullurlpathtoyourrepo/reponame.git
git Push -u Origin --all # pushes up the repo and its refs for the first time
git Push -u Origin --tags # pushes up any tags

Dalam kasus saya, saya tidak perlu perintah tag karena repo saya tidak punya tag.

Semoga berhasil!

0
Ruslan Makrenko

GitHub memiliki importir. Setelah Anda membuat repositori, Anda dapat mengimpor dari repositori yang ada, melalui URL-nya. Itu akan meminta kredensial Anda jika berlaku dan pergi dari sana.

Saat berjalan, ia akan menemukan penulis, dan Anda bisa memetakannya ke pengguna di GitHub.

Saya telah menggunakannya untuk beberapa repositori sekarang, dan itu cukup akurat dan jauh lebih cepat juga! Butuh 10 menit untuk repositori dengan ~ 4000 komitmen, dan setelah itu butuh teman saya empat hari!

0
Josh Benson

Secara efektif menggunakan Git dengan Subversionadalah pengantar yang lembut untuk git-svn. Untuk repositori SVN yang ada, git-svn membuatnya sangat mudah. Jika Anda memulai repositori baru, jauh lebih mudah untuk membuat repositori SVN yang kosong dan kemudian mengimpor menggunakan git-svn daripada menuju ke arah yang berlawanan. Membuat repositori Git baru kemudian mengimpor ke SVN bisa dilakukan, tetapi itu agak menyakitkan, terutama jika Anda baru mengenal Git dan berharap untuk melestarikan sejarah komit.

0
burkestar

Beberapa jawaban di sini merujuk ke https://github.com/nirvdrum/svn2git , tetapi untuk repositori besar ini bisa lambat. Saya telah mencoba menggunakan https://github.com/svn-all-fast-export/svn2git sebagai gantinya adalah alat dengan nama yang persis sama tetapi digunakan untuk memigrasi KDE dari SVN ke Git.

Sedikit lebih banyak pekerjaan untuk mengaturnya tetapi ketika melakukan konversi itu sendiri bagi saya butuh beberapa menit di mana skrip lain menghabiskan berjam-jam.

0
Zitrax

Unduh pemasang Ruby untuk Windows dan instal versi terbaru dengannya. Tambahkan Ruby yang dapat dieksekusi ke jalur Anda.

  • Instal svn2git
  • Mulai menu -> Semua program -> Ruby -> Mulai perintah Prompt dengan Ruby
  • Kemudian ketik "permata instal svn2git" dan masukkan

    Migrasikan repositori Subversion

  • Buka Prompt perintah Ruby dan pergi ke direktori tempat file akan dimigrasi

    Kemudian svn2git http: // [domain name]/svn/[root repositori]

  • Mungkin butuh beberapa jam untuk memigrasi proyek ke Git tergantung pada ukuran kode proyek.

  • Langkah utama ini membantu dalam membuat struktur repositori Git seperti yang disebutkan di bawah ini.

    Batang SVN (/ Project_components) -> Cabang Git master SVN (/ Project_components) -> Cabang Git Tag SVN (/ Project_components) -> Tag Git

Buat repositori jarak jauh dan Dorong perubahan.

0
Nanda

Saya menggunakan skrip berikut untuk membaca file teks yang memiliki daftar semua repositori SVN saya dan mengonversinya menjadi Git, dan kemudian menggunakan git clone --bare untuk mengonversi ke repositori telanjang Git:

#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
 printf '%s\n' "$repo_name"
 Sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name
 Sudo git clone --bare /programs/git/$repo_name $repo_name.git
 Sudo chown -R www-data:www-data $repo_name.git
 Sudo rm -rf $repo_name
done <"$file"

list.txt memiliki format:

repo1_name
repo2_name

Dan users.txt memiliki format:

(no author) = Prince Rogers <[email protected]>

www-data adalah pengguna server web Apache, dan diperlukan izin untuk mendorong perubahan melalui HTTP.

0
Pedro Vicente

Mengubah submodule/folder svn 'MyModule' menjadi git dengan histori tanpa tag atau cabang.

Untuk mempertahankan daftar abaikan svn gunakan komentar di atas setelah langkah 1

0
PShetty