git svn
kullanımıyla ilgili önceki bölümü okuduysanız, bir repoyu svn ile kopyalamak (git svn clone
) için bu talimatları kolayca kullanabilirsiniz: Sonra Subversion sunucusunu durdurup, yeni bir Git sunucusuna itin ve onu kullanmaya başlayın.
Geçmişi istiyorsanız, bunu Subversion sunucusundan verileri çektiğiniz kadar hızlı bir şekilde gerçekleştirebilirsiniz (bu biraz zaman alabilir).
Ancak içe aktarma tamamen mükemmel değildir; çok uzun süreceği için bunu doğru yapsanız iyi olur.
İlk sorun yazar bilgisidir.
Subversion’da katkıda bulunan her kişinin sistemde katkı bilgilerinde kayıtlı bir kullanıcısı vardır.
Önceki bölümdeki örneklerde, blame
çıktısı ve git svn log
gibi bazı yerlerde schacon
gösterilmektedir.
Bunu daha iyi Git yazar verileriyle eşleştirmek istiyorsanız, Subversion kullanıcılarından Git yazarlarına bir eşleştirmeye ihtiyacınız vardır.
Bu eşlemeyi şu şekilde içeren users.txt
adlı bir dosya oluşturun:
schacon = Scott Chacon <schacon@geemail.com>
selse = Someo Nelse <selse@geemail.com>
SVN’nin kullandığı yazar adlarının bir listesini almak için şunu çalıştırabilirsiniz:
$ svn log --xml --quiet | grep author | sort -u | \
perl -pe 's/.*>(.*?)<.*/$1 = /'
Bu komut dizini günlük (log) çıktısını XML biçiminde oluşturur, ardından yalnızca yazar bilgilerinin bulunduğu satırları tutar, yinelenenleri atar ve XML etiketlerini çıkarır (Bariz şekilde, bu yalnızca 'grep', 'sort' ve 'Perl' yüklü bir makinede çalışır.)
Ardından, her girişin yanına eşdeğer Git kullanıcı verilerini ekleyebilmeniz için bu çıktıyı users.txt
dosyanıza yönlendirin.
Yazar verilerini daha doğru bir şekilde eşleştirmesine yardımcı olmak için bu dosyayı git svn
'ye sağlayabilirsiniz.
Ayrıca, clone
veya init
komutuna --no-metadata
seçeneğini ileterek, git svn
'ye Subversion’ın normalde içe aktardığı meta verileri eklememesini de söyleyebilirsiniz (ancak senkronizasyon meta verilerini korumak istiyorsanız, bu parametreyi atlamakta özgürsünüz).
Bu, import
komutunuzun şu şekilde görünmesini sağlar:
$ git svn clone http://my-project.googlecode.com/svn/ \
--authors-file=users.txt --no-metadata --prefix "" -s my_project
$ cd my_project
Artık my_project
dizininizde daha güzel bir Subversion içe aktarımına sahip olmalısınız.
Buna benzeyen katkılar yerine
commit 37efa680e8473b615de980fa935944215428a35a
Author: schacon <schacon@4c93b258-373f-11de-be05-5f7a86268029>
Date: Sun May 3 00:12:22 2009 +0000
fixed install - go to trunk
git-svn-id: https://my-project.googlecode.com/svn/trunk@94 4c93b258-373f-11de-
be05-5f7a86268029
şunun gibi:
commit 03a8785f44c8ea5cdb0e8834b7c8e6c469be2ff2
Author: Scott Chacon <schacon@geemail.com>
Date: Sun May 3 00:12:22 2009 +0000
fixed install - go to trunk
Yazar alanı çok daha iyi görünmekle kalmıyor, aynı zamanda git-svn-id
de artık orada değil.
Ayrıca biraz içe aktarma sonrası temizlik de yapmalısınız.
Bunlardan biri git svn
'nin oluşturduğu tuhaf referansları temizlemektir.
Öncelikle etiketleri, tuhaf uzak dallar yerine gerçek etiketler olacak şekilde, ve ardından geri kalan dalları da yerel olacak şekilde taşıyacaksınız.
Etiketleri uygun Git etiketleri olacak şekilde taşımak için şunu çalıştırın:
$ for t in $(git for-each-ref --format='%(refname:short)' refs/remotes/tags); do git tag ${t/tags\//} $t && git branch -D -r $t; done
Bu, refs/remotes/tags/
ile başlayan uzak dal referanslarını alır ve onları gerçek (hafif) etiketler haline getirir.
Ardından, referansların geri kalanını refs/remotes
altında yerel şubelere taşıyın:
$ for b in $(git for-each-ref --format='%(refname:short)' refs/remotes); do git branch $b refs/remotes/$b && git branch -D -r $b; done
Subversion’da yalnızca bir dal görürken, sonuna @xxx
(burada xxx bir sayıdır) eklenmiş bazı ekstra dallar görebilirsiniz.
Bu aslında peg-revizyonlar
adı verilen bir Subversion özelliğidir ve Git’te sözdizimsel karşılığı olmayan bir şeydir.
Bu nedenle git svn
, svn sürüm numarasını dal adına ekler (tıpkı o dalın sabit revizyonunu ele almak için svn’de yazdığınız gibi) .
Artık sabit düzeltmeleri umursamıyorsanız, bunları kaldırmanız yeterlidir:
$ for p in $(git for-each-ref --format='%(refname:short)' | grep @); do git branch -D $p; done
Artık tüm eski dallar gerçek Git dalları ve tüm eski etiketler gerçek Git etiketleridir.
Temizlenecek son bir şey daha var.
Ne yazık ki, git svn
Subversion’un varsayılan dalına eşlenen trunk
adında fazladan bir dal oluşturur, ancak trunk
ref’i, master
ile aynı yeri işaret eder.
master
kelimesi Git’e daha uyggun bir ifade biçimi olduğundan, fazladan dalın nasıl kaldırılacağı aşağıda açıklanmıştır:
$ git branch -d trunk
Yapılacak son şey, yeni Git sunucunuzu uzak olarak eklemek ve ona itmektir. Sunucunuzu uzak olarak eklemenin bir örneği:
$ git remote add origin git@my-git-server:myrepository.git
Tüm dallarınızın ve etiketlerinizin üste çıkmasını istediğiniz için artık şunu çalıştırabilirsiniz:
$ git push origin --all
$ git push origin --tags
Artık tüm dal ve etiketleriniz güzel ve temiz bir içe aktarma işlemiyle yeni Git sunucunuzda olmalıdır.