SVN’den Git’e Proje Taşımak

Yusuf Kocaman
Codable
Published in
2 min readSep 24, 2021

SVN önceki yıllarda kurumsal projelerin vazgeçilmezi olsa da, artık son yılların popüler versiyon takip sistemi Git’e olan göç talepleri daha da arttı. Bu yazımda sizlere bir SVN projesini; history, tag ve branch kaybı yaşamadan Git’e taşımak için izlediğim adımları anlatacağım.

İhtiyaç duyulan uygulamalar: git , subversion , git-svn
Ek olarak metin editörü ihtiyacı için: vim veya nano

0) Eğer işlem yapılacak işletim sisteminin kurulum depolarında git-svn eklentisi bulunamıyor veya kurulamıyor ise, Docker kurulu bir işletim sistemi üzerinde aşağıdaki komutlar ile Ubuntu terminali oluşturulabilir.

docker run -it --network=host ubuntu bash
apt update
apt install git git-svn subversion
apt install vim

vim yerine nano da metin düzenleme uygulaması olarak kurulabilir.

apt install nano

Örneğimizde, repository’nin adı proje olsun.

1) SVN projesi clone edilir.

svn checkout http://svn-adresi/svn/proje proje-svn

Karışıklık olmaması için proje dizininin sonuna -svn eklenmiştir.
Git-svn ile clone edilenin sonuna da -git eklenecektir.

2) Proje dizinine girilir ve mevcut commit sahiplerinin listesi oluşturulur.

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

3) SVN tipi olan kişi listesinin Git’e uygun olması için kullanıcı adlarına karşılık gelen e-posta, isim ve soyisimler ile revize edilir.

vim users.txt

Eğer isim soyisim çok önemli değilse, en azından e-posta adresleri tanımlanmalıdır. Aşağıdaki komut ile, SVN kullanıcı isimlerinin sonuna domain eklenilerek, e-posta formatı oluşturulabilir.

sed -i 's/>/@domain.com>/g' users.txt

Bu adımdan sonra proje-svn ile işimiz bitti. Sadece, history’de bulunan kullanıcıların listesini çıkarabilmemizi sağladı.

4) Git SVN plugin’i ile tekrar SVN clone edilir. Fakat bu sefer Git altyapısı ile indiririyoruz. Proje dizininin sonuna -git eklendi.

git svn clone http://svn-adresi/svn/proje --authors-file=users.txt --stdlayout --no-metadata --prefix "" proje-git

5) Tag, branch ve history için gereken çeviri yapılır.

cd proje-gitfor t in $(git for-each-ref --format='%(refname:short)' refs/remotes/tags); do git tag ${t/tags\//} $t && git branch -D -r $t; donefor b in $(git for-each-ref --format='%(refname:short)' refs/remotes); do git branch $b refs/remotes/$b && git branch -D -r $b; donefor p in $(git for-each-ref --format='%(refname:short)' | grep @); do git branch -D $p; donegit branch -d trunk

6) Son olarak yeni repository’nin adresi eklenir ve push işlemi yapılması gerekir.

git remote add origin http://git-adresi/yeni/git-projesi.gitgit push origin --allgit push origin --tags

Bahsettiğim 6 adım ile sorun yaşamadan onlarca SVN projesini taşımayı başarabildim. Eğer herhangi bir hata ile karşılaşır veya katkı yapmak isterseniz, yorumlar üzerinden paylaşabilirsiniz.

--

--