SVN’den Git’e Proje Taşımak
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
veyanano
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
yerinenano
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.