Skip to content

Latest commit

 

History

History
128 lines (96 loc) · 5.64 KB

import-svn.asc

File metadata and controls

128 lines (96 loc) · 5.64 KB

Subversion

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.