Bagikan melalui


Pelajari cara bermigrasi dari Subversion (SVN) ke Git, termasuk riwayat

Layanan Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019

Saat pindah ke Git dari sistem kontrol versi lain seperti Subversion (SVN), kami umumnya menyarankan agar Anda melakukan "migrasi tip", yang hanya memigrasikan versi terbaru konten repositori, tanpa menyertakan riwayat. Namun, banyak orang ingin melakukan migrasi yang lebih canggih, termasuk riwayat. Panduan yang diberikan dalam artikel ini memperkenalkan migrasi dengan riwayat.

Migrasi SVN ke Git dapat bervariasi dalam kompleksitas, tergantung pada berapa lama repositori dan berapa banyak cabang yang dibuat dan digabungkan, dan apakah Anda menggunakan SVN biasa atau relatif dekat seperti SVK.

Bisa jadi sederhana jika:

  • Anda memiliki repositori baru
  • Anda memiliki pengaturan standar batang, cabang, dan direktori tag

Kemungkinan akan rumit jika:

  • Tim Anda telah melakukan banyak operasi percabangan dan penggabungan
  • Repositori Anda mengikuti penyiapan direktori non-standar
  • Penyiapan direktori Anda telah berubah dari waktu ke waktu

Ada beberapa cara untuk bermigrasi dari SVN ke Git. Pendekatan yang diuraikan dalam artikel ini didasarkan pada penggunaan git-svn, ekstensi Git, yang dapat digunakan untuk memeriksa repositori Subversi ke repositori Git lokal dan kemudian mendorong perubahan dari repositori Git lokal kembali ke repositori Subversi. Langkah-langkah ini memberikan gambaran terperinci tentang proses migrasi dari SVN ke Git di lingkungan Windows, tanpa menyinkronkan kembali ke repositori SVN asli. Hasilnya akan menjadi repositori Git kosong untuk dibagikan dengan tim Anda lainnya.

Catatan

Sebelum Anda mencoba memigrasikan kode sumber Anda dari sistem kontrol versi terpusat ke Git, pastikan Anda membiasakan diri dengan perbedaan antara sistem kontrol versi terpusat dan terdistribusi, dan merencanakan migrasi tim Anda. Setelah menyiapkan, Anda dapat memulai migrasi.

Alur kerja tingkat tinggi untuk migrasi dari SVN ke Git adalah sebagai berikut:

  • Menyiapkan lingkungan migrasi
  • Mengonversi repositori SVN sumber ke repositori Git lokal
  • (Opsional) Menyinkronkan repositori Git lokal dengan perubahan apa pun dari repositori SVN saat pengembang terus menggunakan SVN
  • Mendorong repositori Git lokal ke repositori Git jarak jauh yang dihosting di Azure Repos
  • Kunci repositori SVN, sinkronkan perubahan yang tersisa dari repositori SVN ke repositori Git lokal dan dorong perubahan akhir ke repositori Git jarak jauh di Azure Repositori
  • Pengembang beralih ke Git sebagai sistem kontrol sumber utama

Menyiapkan lingkungan migrasi

Konfigurasikan lingkungan migrasi di stasiun kerja lokal dan instal perangkat lunak berikut:

Anda juga harus membuat repositori Git agar organisasi Anda dapat menghosting repositori SVN yang dikonversi, Anda dapat mengikuti Membuat repositori Git baru di proyek Anda

Mengonversi repositori SVN sumber ke repositori Git lokal

Tujuan dari langkah ini adalah untuk mengonversi repositori Subversion sumber menjadi repositori Git telanjang lokal. Repositori Git telanjang tidak memiliki pemeriksaan kerja lokal file yang dapat diubah, sebaliknya hanya berisi riwayat repositori dan metadata tentang repositori itu sendiri. Ini adalah format yang direkomendasikan untuk berbagi repositori Git melalui repositori jarak jauh yang dihosting pada layanan seperti Azure Repos.

Tip

Repositori Bare Git disusun secara berbeda dan mengingat fakta bahwa repositori tersebut tidak memiliki direktori kerja mencegah penerapan langsung ke repositori.

Repositori git telanjang

Mengambil daftar semua penulis Subversion

Subversi hanya menggunakan nama pengguna untuk setiap penerapan, sementara Git menyimpan nama asli dan alamat email. Secara default, alat git-svn akan mencantumkan nama pengguna SVN di bidang penulis dan email. Namun, Anda dapat membuat file pemetaan untuk pengguna SVN bersama dengan nama dan email Git yang sesuai.

Pengguna subversi

Pengguna subversi

Pengguna Git

pengguna git

Untuk mengekstrak daftar semua pengguna SVN dari akar checkout Subversion lokal Anda, jalankan perintah PowerShell ini:

Untuk hasil dalam utf8NoBOM pengodean, jalankan perintah berikut:

svn.exe log --quiet | ? { $_ -notlike '-*' } | % { "{0} = {0} " -f ($_ -split ' | ')[1] } | Select-Object -Unique | Sort-Object | Out-File 'authors-transform.txt' -Encoding utf8NoBOM

Untuk hasil dalam ASCII pengodean, jalankan perintah berikut:

svn.exe log --quiet | ? { $_ -notlike '-*' } | % { "{0} = {0} " -f ($_ -split ' | ')[1] } | Select-Object -Unique | Sort-Object | Out-File 'authors-transform.txt' -Encoding ASCII

Perintah ini akan mengambil semua pesan log, mengekstrak nama pengguna, menghilangkan nama pengguna duplikat, mengurutkan nama pengguna, dan menempatkannya ke dalam file authors-transform.txt dalam format UTF-8 (atau format ASCII, tergantung pada pengodean mana yang Anda tentukan). Anda kemudian dapat mengedit setiap baris dalam file untuk membuat pemetaan pengguna SVN ke pengguna Git yang diformat dengan baik. Misalnya, Anda dapat memetakan jamal = jamal <jamal> ke jamal = Jamal Hartnett <jamal@fabrikam-fiber.com>.

Mengkloning repositori Subversi menggunakan git-svn

Perintah berikut akan melakukan transformasi git-svn standar menggunakan file authors-transform.txt yang dibuat pada langkah sebelumnya. Ini akan menempatkan repositori Git di c:\mytempdir folder di komputer lokal Anda.

git svn clone ["SVN repo URL"] --prefix=svn/ --no-metadata --authors-file "authors-transform.txt" --stdlayout c:\mytempdir

Catatan

--prefix=svn/ diperlukan karena jika tidak, alat tidak dapat memberi tahu revisi SVN dari yang diimpor. Sebaiknya atur awalan (dengan garis miring berikutnya), karena ref pelacakan SVN Anda kemudian akan terletak di refs/remotes/$prefix/, yang kompatibel dengan tata letak cabang pelacakan jarak jauh Git sendiri (refs/remotes/$remote/).

Mengatur awalan juga berguna jika Anda ingin melacak beberapa proyek yang berbagi repositori umum. Secara default, awalan diatur ke origin/.

Jika Anda menggunakan batang standar, cabang, tata letak tag, Anda hanya akan menempatkan --stdlayout. Namun, jika Anda memiliki sesuatu yang berbeda, Anda mungkin harus meneruskan --trunk, --branches, dan --tags untuk menemukan apa itu. Misalnya, jika struktur repositori Anda adalah trunk/companydir dan Anda bercabang bahwa alih-alih batang, Anda mungkin ingin --trunk=trunk/companydir --branches=branches.

git svn clone ["SVN repo URL"] --prefix=svn/ --no-metadata --trunk=/trunk --branches=/branches --tags=/tags  --authors-file "authors-transform.txt" c:\mytempdir

Catatan

Perintah ini dapat memakan waktu beberapa menit hingga beberapa jam tergantung pada ukuran repositori SVN. Setelah selesai, Anda akan memiliki git checkout repositori Anda.

Mengonversi konfigurasi khusus kontrol versi

Jika repositori SVN Anda menggunakan properti svn:ignore, Anda dapat mengonversi ke file .gitignore menggunakan:

cd c:\mytempdir
git svn show-ignore --id=origin/trunk > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

Tip

Baca selengkapnya tentang .gitignore: Abaikan perubahan file dengan Git

Dorong repositori ke repositori git telanjang

Dalam langkah ini, Anda akan membuat repositori kosong dan membuat cabang defaultnya cocok dengan nama cabang batang SVN.

  1. Membuat repositori Git kosong

    git init --bare c:\new-bare.git
    cd c:\new-bare.git
    git symbolic-ref HEAD refs/heads/svn/trunk
    
  2. Dorong repositori Git lokal ke repositori Git telanjang baru

    cd c:\mytempdir 
    git remote add bare c:\new-bare.git 
    git config remote.bare.push refs/remotes/*:refs/heads/* 
    git push bare 
    
  3. Ganti nama cabang menjadi trunk main. Cabang pengembangan utama Anda akan diberi nama "trunk", yang cocok dengan nama yang ada di Subversion. Anda harus mengganti namanya menjadi cabang standar main Git menggunakan:

    cd c:\new-bare.git
    git branch -m svn/trunk main
    
  4. Membersihkan cabang dan tag git-svn membuat semua tag Subversions menjadi cabang yang sangat pendek di Git dari bentuk "tag/nama". Anda akan ingin mengonversi semua cabang tersebut menjadi tag Git yang sebenarnya atau menghapusnya.

Memigrasikan tag SVN menjadi tag Git

cd c:\new-bare.git
git for-each-ref --format='%(refname)' refs/heads/svn/tags | % { $_.Replace('refs/heads/svn/tags/','') } | % { git tag $_ "refs/heads/svn/tags/$_"; git branch -D "svn/tags/$_" }

Migrasi tingkat lanjut

Membuat semua cabang SVN sebagai cabang Git yang tepat

Meskipun mudah untuk membuat semua cabang SVN sebagai cabang Git yang tepat, disarankan agar Anda mengevaluasi poin-poin berikut sebelum melanjutkan:

  • Jika ada cabang Fitur: Dapatkah Anda menunggu hingga berintegrasi ke bagasi sebelum bermigrasi?

  • Jika ada cabang Rilis: Apakah masuk akal untuk menjaga SVN tetap siap melayani? Jika Anda memigrasikan cabang fitur, apakah Anda siap untuk melayani cabang dari Git?

Jika Anda masih ingin memigrasikan cabang yang ada, jalankan perintah PowerShell berikut ini:

git for-each-ref --format='%(refname)' refs/remotes | % { $_.Replace('refs/remotes/','') } | % { git branch "$_" "refs/remotes/$_"; git branch -r -d "$_"; }

Catatan

Perintah ini dapat memakan waktu beberapa menit hingga beberapa jam tergantung pada ukuran repositori SVN. Setelah selesai, Anda akan memiliki git checkout repositori Anda.

Memigrasikan hanya revisi tertentu

Ketika tidak ditentukan, git-svn clone akan memigrasikan semua revisi dari penerapan pertama (r1) ke HEAD. Jika Anda hanya perlu memigrasikan sekumpulan revisi tertentu, perintah untuk git-svn clone harus ditambahkan dengan opsi .-r

Misalnya, jika Anda perlu bermigrasi dari rev 100 ke HEAD, perintah terlihat seperti ini:

git svn clone ["SVN repo URL"] --prefix=svn/ --no-metadata --authors-file "authors-transform.txt" --stdlayout c:\mytempdir -r100:HEAD

Memperbarui alur kerja Anda

Berpindah dari sistem kontrol versi terpusat ke Git lebih dari sekadar memigrasikan kode. Tim Anda memerlukan pelatihan untuk memahami bagaimana Git berbeda dari sistem kontrol versi yang ada dan bagaimana perbedaan ini memengaruhi pekerjaan sehari-hari. Pelajari selengkapnya.

Informasi referensi

Penulis: Hosam Kamel, William H. Salazar | Temukan asal artikel ini dan sambungkan dengan ALM | Panduan Percabangan DevOps Rangers

(c) 2017 Microsoft Corporation. Semua hak dilindungi undang-undang. Dokumen ini disediakan "apa adanya." Informasi dan tampilan yang dinyatakan dalam dokumen ini, termasuk URL dan referensi situs Web Internet lainnya, dapat berubah tanpa pemberitahuan. Anda menanggung risiko menggunakannya.

Dokumen ini tidak memberi Anda hak hukum apa pun atas kekayaan intelektual apa pun dalam produk Microsoft apa pun. Anda dapat menyalin dan menggunakan dokumen ini sebagai referensi internal.