it-swarm-tr.com

Geçmişi olan bir SVN deposunu yeni bir Git deposuna nasıl geçiririm?

Git kılavuzu, SSS, Git - SVN çarpışma kursu vs.'yi okudum ve hepsi bunu ve bunu açıklıyor, ancak hiçbir yerde aşağıdaki gibi basit bir talimat bulamıyorsunuz:

SVN deposu: svn://myserver/path/to/svn/repos

Git deposu: git://myserver/path/to/git/repos

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

O kadar basit olmasını beklemiyorum ve tek bir komut olmasını beklemiyorum. Ancak hiçbir şeyi açıklamaya çalışmamasını bekliyorum - sadece bu örneğe hangi adımları atacağınızı söylemek için.

1453
Milan Babuškov

Sihirli:

$ git svn clone http://svn/repo/here/trunk

Git ve SVN çok farklı çalışır. Git'i öğrenmeniz gerekir ve SVN akışındaki değişiklikleri izlemek istiyorsanız git-svn öğrenmeniz gerekir. git-svn kılavuz sayfası iyi bir örnek bölüme sahiptir:

$ git svn --help
513
jfm3

SVN kullanıcılarını Git ile eşlemek için bir kullanıcı dosyası (örneğin, users.txt) oluşturun:

user1 = First Last Name <[email protected]>
user2 = First Last Name <[email protected]>
...

Mevcut tek SVN deponuzdan bir şablon oluşturmak için bu tek astarı kullanabilirsiniz:

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

Dosyada olmayan bir SVN kullanıcısı bulursa, SVN duracaktır. Ancak bundan sonra dosyayı güncelleyebilir ve kaldığınız yerden alabilirsiniz.

Şimdi SVN verilerini depodan çekin:

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp

Bu komut, dest_dir-tmp içinde yeni bir Git deposu oluşturacak ve SVN deposunu çekmeye başlayacaktır. "--Stdlayout" bayrağının ortak "trunk /, dalları /, tags /" SVN düzenine sahip olduğunuzu ima ettiğini unutmayın. Düzeniniz farklıysa, --tags, --branches, --trunk seçeneklerine aşina olun (genel olarak git svn help).

Tüm yaygın protokollere izin verilir: svn://, http://, https://. URL, http://svn.mycompany.com/myrepo/repository gibi bir temel havuzu hedeflemelidir. Olması gereken değil /trunk, /tag veya /branches.

Bu komutu yürüttükten sonra işlemin genellikle "asılı/dondurulmuş" gibi göründüğünü ve yeni depoyu başlattıktan sonra uzun süre takılıp kalmasının normal olduğunu unutmayın. Sonunda, göç ettiğini gösteren günlük mesajlarını göreceksiniz.

Ayrıca, --no-metadata bayrağını çıkarırsanız Git'in ilgili SVN revizyonuyla ilgili bilgileri taahhüt mesajına ekleyeceğini unutmayın (ör. git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>)

Bir kullanıcı adı bulunamazsa, users.txt dosyanızı güncelleyin ve sonra:

cd dest_dir-tmp
git svn fetch

Büyük bir projeniz varsa, tüm Subversion taahhütleri alınana kadar bu son komutu birkaç kez tekrarlamanız gerekebilir:

git svn fetch

Tamamlandığında Git, SVN trunk öğesini yeni bir dalda teslim alacak. Diğer dallar uzaktan kumanda olarak ayarlanmıştır. Diğer SVN şubelerini aşağıdakilerle görüntüleyebilirsiniz:

git branch -r

Diğer uzak dalları havuzunuzda tutmak istiyorsanız, her biri için el ile yerel bir şube oluşturmak istiyorsunuz. (Trunk/master atla.) Bunu yapmazsanız, dallar son adımda klonlanmayacaktır.

git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name

Etiketler dallar olarak içe aktarılır. Git'te bir etiket olarak yerel bir şube oluşturmalı, bir etiket yapmalı ve dalı silmelisiniz. "V1" etiketiyle yapmak için:

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

GIT-SVN deponuzu temiz bir Git deposuna klonlayın:

git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir

Uzak şubelerden daha önce oluşturduğunuz yerel şubeler, yalnızca yeni klonlanmış havuza uzak şubeler olarak kopyalanacaktır. (Trunk/master atla.) Saklamak istediğiniz her dal için:

git checkout -b local_branch Origin/remote_branch

Son olarak, uzaktan kumandayı şimdi silinen geçici depoya işaret eden temiz Git havuzunuzdan çıkarın:

git remote rm Origin
1512
cmcginty

Subversion Deponuzu Temiz Bir Git Deposuna Göç Edin . Öncelikle, Subversion için taahhütte bulunan yazar isimlerini Git taahhütlerine gösteren bir dosya oluşturmanız gerekir, örneğin: ~/authors.txt:

jmaddox = Jon Maddox <[email protected]>
bigpappa = Brian Biggs <[email protected]>

Ardından Subversion verilerini Git deposuna indirebilirsiniz:

mkdir repo && cd repo
git svn init http://Subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

Mac kullanıyorsanız, git-svn dosyasını yükleyerek MacPorts'tan git-core +svn komutunu alabilirsiniz.

Subversion deponuz istediğiniz git deposuyla aynı makinedeyse, bu sözdizimini init adımı için kullanabilirsiniz, aksi halde hepsi aynı:

git svn init file:///home/user/repoName --no-metadata
185
Eugene Yokota

svn2git kodunu kullandım ve bir cazibe gibi çalışıyorum.

69

Git-svn'yi sürekli kullanmaya çalışmadan önce Git ile rahat olmanızı, yani SVN'yi merkezi depo olarak tutmanızı ve Git'i yerel olarak kullanmanızı öneririm.

Ancak, tüm geçmişe sahip basit bir göç için, işte birkaç basit adım:

Yerel depoyu başlat:

mkdir project
cd project
git svn init http://svn.url

Revizyonları ne kadar geri almaya başlamak istediğinizi işaretleyin:

git svn fetch -r42

(veya sadece tüm sürümler için "git svn fetch")

Aslında o zamandan beri her şeyi al.

git svn rebase

İçe aktarma sonucunu Gitk ile kontrol edebilirsiniz. Bu Windows'ta çalışırsa, OSX ve Linux'ta çalıştığından emin değilim:

gitk

SVN reponuzu yerel olarak klonladığınızda, daha kolay bir işbirliği için merkezi bir Git deposuna itmek isteyebilirsiniz.

Öncelikle boş bir uzaktan deponuzu oluşturun (belki - GitHub ?):

git remote add Origin [email protected]:user/project-name.git

Ardından, isteğe bağlı olarak ana şubenizi senkronize edin, böylece her ikisi de yeni şeyler içerdiğinde, çekme işlemi otomatik olarak ana master ile yerel yöneticinizle birleşir:

git config branch.master.remote Origin
git config branch.master.merge refs/heads/master

Bundan sonra, uzak dallarla uğraşmanıza yardımcı olacak kendi git_remote_branch aracımı denemek isteyebilirsiniz:

İlk açıklayıcı yazı: " Git uzak şubeleri "

En son sürümün takibi: " git_remote_branch " ile ortak çalışma zamanı

57
webmat

Subversion'dan Git'e sorunsuz geçiş için yeni bir çözüm var (veya her ikisini aynı anda kullanmak için): SubGit .

Bu proje üzerinde kendim çalışıyorum. SubGit'i depolarımızda kullanıyoruz - bazı takım arkadaşlarım Git ve bazı Subversion kullanıyor ve şu ana kadar çok iyi çalışıyor.

SubGit ile Subversion'dan Git'e geçmek için çalıştırmanız gerekir:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

Bundan sonra Git deposunu svn_repos/.git içinde alacaksınız ve klonlayabilir veya Subversion ile birlikte bu yeni Git deposunu birlikte kullanmaya devam edebilirsiniz: SubGit, her ikisinin de her zaman senkronize tutulduğundan emin olacaktır.

Subversion deponuzda birden fazla proje bulunması durumunda, svn_repos/git dizininde birden fazla Git deposu oluşturulacaktır. Çalıştırmadan önce çeviriyi özelleştirmek için aşağıdakileri yapın:

$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos

SubGit ile saf Git'e (git-svn değil) geçiş yapabilir ve Subversion'u ihtiyacınız olduğu sürece tutarken kullanmaya başlayabilirsiniz (örneğin, önceden yapılandırılmış yapım araçlarınız için).

Bu yardımcı olur umarım!

30
Alexander Kitaev

Resmi git-svn kılavuz sayfasına bakınız. Özellikle, "Temel Örnekler" bölümüne bakınız:

Tüm Subversion tarafından yönetilen bir projenin izlenmesi ve katkıda bulunulması (bir bagaj, etiketler ve dallar ile birlikte):

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags
17
EfForEffort
13
kdahlhaus

reposurgeon

Karmaşık durumlar için, Eric S. Raymond tarafından yapılan reposurgeon, tercih edilen araçtır. SVN'ye ek olarak, fast-export formatı yoluyla diğer birçok sürüm kontrol sistemini de destekler ve ayrıca CVS . Yazar, Emacs ve FreeBSD gibi eski depoların başarılı dönüşümlerini rapor eder.

Görünüşe göre bu araç neredeyse mükemmel dönüşümü hedeflemektedir (uzun bir geçmişe sahip zor havuz düzenlerinde bile SVN'in svn:ignore özelliklerini .gitignore dosyalarına dönüştürme gibi). Çoğu durumda, diğer araçların kullanımı daha kolay olabilir.

reposurgeon komut satırının belgelerine geçmeden önce, dönüşüm işleminin adım adım ilerleyen mükemmel DVCS geçiş kılavuzu bölümünü okuduğunuzdan emin olun.

9
krlmlr

Atlassian'ın web sitesinde bulunan bu rehber, bulduğum en iyilerden biri:

https://www.atlassian.com/git/migration

Bu araç - https://bitbucket.org/atlassian/svn-migration-scripts - aynı zamanda diğerlerinin yanı sıra authors.txt dosyasını oluşturmak için de kullanışlıdır.

7
Andrew B

Yüklemek zorunda

git
git-svn

Bu bağlantıdan kopyalandı http://john.albin.net/git/convert-Subversion-to-git .

1. Tüm Subversion işverenlerinin listesini al

Subversion her bir işlem için kullanıcı adını listeler. Git’in taahhütleri çok daha zengin verilere sahip, ancak en basitinde, söz konusu yazarın bir ad ve e-posta listesine sahip olması gerekiyor. Git-svn aracı varsayılan olarak hem yazar hem de e-posta alanlarındaki SVN kullanıcı adını listeleyecektir. Ancak, az miktarda çalışmayla, tüm SVN kullanıcılarının ve karşılık gelen Git adlarının ve e-postalarının ne olduğunu gösteren bir liste oluşturabilirsiniz. Bu liste, git-svn tarafından düz svn kullanıcı adlarını uygun Git taahhüt sahiplerine dönüştürmek için kullanılabilir.

Yerel Subversion satın alma işleminizin kökünden bu komutu çalıştırın:

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt

Bu, tüm günlük mesajlarını alır, kullanıcı adlarını alır, yinelenen kullanıcı adlarını elimine eder, kullanıcı adlarını sıralar ve bir “authors-transform.txt” dosyasına yerleştirir. Şimdi dosyadaki her satırı düzenleyin. Örneğin, dönüştür:

jwilkins = jwilkins <jwilkins>

bunun içine:

jwilkins = John Albin Wilkins <[email protected]>

2. Git-svn kullanarak Subversion deposunu klonlayın

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

Bu, standart git-svn dönüşümünü gerçekleştirir (1. adımda oluşturduğunuz author-transform.txt dosyasını kullanarak) ve git deposunu giriş dizininizdeki “~/temp” klasörüne yerleştirin.

3. svn dönüştür: özellikleri yoksay .gitignore

Eğer svn deponuz svn: ignore özelliklerini kullanıyorsa, bunu kullanarak kolayca bir .gitignore dosyasına dönüştürebilirsiniz:

cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

4. Deposunu çıplak bir git deposuna itin

İlk önce çıplak bir depo oluşturun ve varsayılan şubesini svn'nin “trunk” şube adıyla eşleştirin.

git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk

Sonra geçici veri havuzunu yeni çıplak veri havuzuna itin.

cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.Push 'refs/remotes/*:refs/heads/*'
git Push bare

Artık ~/temp deposunu güvenle silebilirsiniz.

5. “ana” dalı “ana” olarak yeniden adlandırın

Ana gelişim şubeniz, Subversion'daki ismiyle eşleşen “trunk” olarak adlandırılacaktır. Aşağıdakileri kullanarak Git’in standart “ana” şubesine yeniden adlandırmak isteyeceksiniz:

cd ~/new-bare.git
git branch -m trunk master

6. Dalları ve etiketleri temizle

git-svn, tüm Subversions etiketlerini Git'teki “tags/name” şeklindeki çok kısa dallara dönüştürür. Tüm bu dalları aşağıdakileri kullanarak gerçek Git etiketlerine dönüştürmek isteyeceksiniz:

cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done

Bu adım biraz yazmaya başlayacak. :-) Fakat endişelenmeyin; unix Kabuğunuz, git-her-ref için başlayan uzun komut için bir> İkincil Bilgi İstemi sağlayacaktır.

7
Valarpirai

Sadece git, SVN ve bash kullanarak biraz genişletilmiş bir cevap. Geleneksel düzeni bir gövde/dallar/etiketler dizin düzeni ile kullanmayan SVN depoları için adımlar içerir (SVN, bu tür bir düzeni zorlamak için kesinlikle hiçbir şey yapmaz).

Öncelikle, bu bash betiğini, katkıda bulunan farklı kişiler için SVN deponuzu taramak ve bir eşleme dosyası için bir şablon oluşturmak için kullanın:

#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
  echo "${author} = NAME <[email protected]>";
done

Bunu, svn kullanıcı adlarını git config properties user.name ve user.email komutlarını kullanarak geliştiricileriniz tarafından belirlenen kullanıcı adlarına ve e-postalarına eşleştirdiğiniz bir authors dosyası oluşturmak için kullanın (GitHub gibi bir hizmet için yalnızca eşleşen bir e-postanın yeterli olduğunu unutmayın).

Daha sonra git svn / svn deposunu git deposuna klonlayarak eşleme hakkında bilgi verin:

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

Git svn, var olan her etiket veya dal için her revizyonu ayrı ayrı kontrol edeceğinden bu son derece uzun sürebilir. (SVN'deki etiketlerin sadece gerçekten dallar olduğuna dikkat edin, bu yüzden Git'te olduğu gibi biterler). İhtiyacınız olmayan SVN'deki eski etiketleri ve dalları kaldırarak bunu hızlandırabilirsiniz.

Bunu aynı ağdaki bir sunucuda veya aynı sunucuda çalıştırmak da bunu gerçekten hızlandırabilir. Ayrıca, bir nedenden ötürü bu işlemin kesilmesi durumunda can kullanarak devam et

git svn rebase --continue

Birçok durumda burada işin bitmiştir. Ancak SVN repo'nuz, SVN'de bir git dalına yerleştirmek istediğiniz bir dizinin olduğu sıra dışı bir düzen içeriyorsa, bazı ek adımlar atabilirsiniz.

En basit olanı, sunucunuzda kongre kurallarını izleyen yeni bir SVN repo yapmak ve dizini trunk veya dalda koymak için svn copy komutunu kullanmaktır. Dizininiz tam olarak repo kökünde ise, bu git svn'u en son denediğimde bu bir ödeme yapmayı reddettiğim tek yol olabilir.

Bunu git kullanarak da yapabilirsiniz. git svn clone için bir git dalına koymak istediğiniz dizini kullanın.

Çalıştırdıktan sonra

git branch --set-upstream master git-svn
git svn rebase

Bunun Git 1.7 veya üstü bir sürüm gerektirdiğini unutmayın.

6
thoutbeckers

GitHub artık SVN deposundan alma özelliğine sahip. Yine de hiç denemedim.

6
webmat

Svn etiketlerini git etiketlerine ve svn dallarını git dallarına dönüştürme dahil olmak üzere svn in git'i dönüştürmek için adım adım kılavuz ( here ) gönderdim.

Kısa versiyon:

1) belirli bir revizyon numarasından svn'yi klonlayın. (revizyon numarası, taşımak istediğiniz en eski sayı olmalıdır)

git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame

2) svn verilerini alır. Bu adım en çok zaman alan adımdır.

cd gitreponame
git svn fetch

hatasız bitene kadar git svn fetch tekrarlayın

3) ana şubenin güncellenmesini sağlayın

git svn rebase

4) Referansları kopyalayarak svn şubelerinden yerel şubeler oluşturun.

cp .git/refs/remotes/Origin/* .git/refs/heads/

5) svn etiketlerini git etiketlerine dönüştür

git for-each-ref refs/remotes/Origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/Origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done

6) Bir depoyu github gibi daha iyi bir yere koyun.

git remotes add newrepo [email protected]:aUser/aProjectName.git
git Push newrepo refs/heads/*
git Push --tags newrepo

Daha fazla ayrıntı istiyorsanız, post veya bana sor.

5
Pablo Belaustegui

Aşağıdaki gibi git svn clone komutlarını kullanabiliriz.

  • svn log -q <SVN_URL> | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors.txt

Yukarıdaki komut, SVN komisyonlarından yazarlar dosyası yaratacaktır.

  • svn log --stop-on-copy <SVN_URL>

SVN projeniz oluşturulduğunda yukarıdaki komut size ilk revizyon numarasını verecektir.

  • git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>

Yukarıdaki komut yerel olarak Git deposunu yaratacaktır.

Sorun dalları ve etiketleri Push'a dönüştürmemesidir. Bunları manuel olarak yapmanız gerekecek. Örneğin şubeler için:

$ git remote add Origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
* master
  remotes/Origin/MyDevBranch
  remotes/Origin/tags/MyDevBranch-1.0
  remotes/Origin/trunk
$$ git checkout -b MyDevBranch Origin/MyDevBranch
Branch MyDevBranch set up to track remote branch MyDevBranch from Origin.
Switched to a new branch 'MyDevBranch'
$ git branch -a
* MyDevBranch
  master
  remotes/Origin/MyDevBranch
  remotes/Origin/tags/MyDevBranch-1.0
  remotes/Origin/trunk
$

Etiketler için:

$git checkout Origin/tags/MyDevBranch-1.0
Note: checking out 'Origin/tags/MyDevBranch-1.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 3041d81... Creating a tag
$ git branch -a
* (detached from Origin/tags/MyDevBranch-1.0)
  MyDevBranch
  master
  remotes/Origin/MyDevBranch
  remotes/Origin/tags/MyDevBranch-1.0
  remotes/Origin/trunk
$ git tag -a MyDevBranch-1.0 -m "creating tag"
$git tag
MyDevBranch-1.0
$

Şimdi master, dalları ve etiketleri uzaktan git deposuna itin.

$ git Push Origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
 * [new branch]      master -> master
 * [new branch]      MyDevBranch -> MyDevBranch
 * [new tag]         MyDevBranch-1.0 -> MyDevBranch-1.0
$

svn2git yardımcı programı

svn2git utility, dallar ve etiketlerle el ile yapılan çalışmaları kaldırır.

Sudo gem install svn2git komutunu kullanarak kurun. Bundan sonra aşağıdaki komutu çalıştırın.

  • $ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>

Artık dalları, etiketleri listeleyebilir ve kolayca bastırabilirsiniz.

$ git remote add Origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
  MyDevBranch
* master
  remotes/svn/MyDevBranch
  remotes/svn/trunk
$ git tag
  MyDevBranch-1.0
$ git Push Origin master MyDevBranch MyDevBranch-1.0

20 dalınız ve etiketiniz olduğunu hayal edin, açıkçası svn2git size zaman kazandıracak ve bu yüzden onu yerel komutlardan daha çok seviyorum. Yerel git svn clone komutu etrafındaki güzel bir sarmalayıcı.

Tam bir örnek için, blog girişime bakınız.

5
Pankaj

TortoiseGit bunu yapar. bu blog gönderisine bakın: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients

Evet, bağlantılara cevap vermenin harika olmadığını biliyorum ama bu bir çözüm değil mi?

4
CAD bloke

GitLab kullanicilari Burada SVN'den nasil göç ettigime dair bir Gist koydum:

https://Gist.github.com/leftclickben/322b7a3042cbe97ed2af

SVN'den GitLab'a geçiş adımları

Kurmak

  • SVN, svn.domain.com.au adresinde barındırılmaktadır.
  • SVN'ye httpüzerinden erişilebilir (diğer protokoller çalışmalıdır).
  • GitLab git.domain.com.au ve: Adresinde barındırılmaktadır.
    • dev-team adlı bir grup oluşturulur.
    • En az bir kullanıcı hesabı oluşturulur, gruba eklenir ve taşıma için kullanılan hesap için bir SSH anahtarı bulunur (ssh [email protected] kullanarak test edin).
    • favourite-project projesi dev-team ad alanında yaratılmıştır.
  • users.txt dosyası, username = First Last <[email protected]> formunun satır başına bir kullanıcısı olan ilgili kullanıcı ayrıntılarını içerir; burada usernamename__, SVN günlüklerinde verilen kullanıcı adıdır. (Ayrıntılar için, özellikle kullanıcı Casey tarafından verilen cevap için Referanslar bölümündeki ilk bağlantıya bakın).

Sürümler

  • Subversion sürüm 1.6.17 (r1128011)
  • git sürüm 1.9.1
  • GitLab sürüm 7.2.1 ff1633f
  • Ubuntu sunucusu 14.04

Komutları

bash
git svn clone --stdlayout --no-metadata -A users.txt 
http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab [email protected]:dev-team/favourite-project.git
git Push --set-upstream gitlab master

Bu kadar! Proje sayfasını GitLab web kullanıcı arayüzünde yeniden yüklediğinizde, listelenen tüm taahhütleri ve dosyaları göreceksiniz.

Notlar

  • Bilinmeyen kullanıcılar varsa, git svn clone komutu durur, bu durumda users.txt, cd favourite-project ve git svn fetch güncellemeleri durduğu yerden devam eder.
  • SVN deposu için standart trunkname __-tagsname __-branchesdüzeni gereklidir.
  • git svn clone komutuna verilen SVN URL'si trunk/, tags/ ve branches/ öğelerinin hemen üzerindeki seviyede durur.
  • git svn clone komutu, üst kısımdaki uyarıları da içeren çok fazla çıktı üretir; Uyarıları görmezden geldim.
3
leftclickben

SourceTree kullanıyorsanız bunu doğrudan uygulamadan yapabilirsiniz. Goto File -> New/Clone sonra şunları yapın:

  1. Uzak SVN URL'sini "Kaynak Yolu/URL" olarak girin.
  2. İstendiğinde kimlik bilgilerinizi girin.
  3. Yerel klasör konumunu "Hedef yolu" olarak girin.
  4. Bir isim ver.
  5. Gelişmiş seçeneklerde, "Yazının yerel deposunu oluştur" daki açılır menüden "Git" i seçin.
  6. İsteğe bağlı olarak, klonlamak için bir revizyon belirleyebilirsiniz.
  7. Clone'a bas.

Repo'yu SourceTree'de açın; taahhüt iletilerinizin de taşındığını göreceksiniz.

Şimdi Depo -> Depo Ayarları'na gidin ve yeni uzak repo ayrıntılarını ekleyin. İsterseniz SVN uzaktan kumandayı silin ("Yapılandırma Dosyasını Düzenle" seçeneği ile bunu yaptım.

Hazır olduğunuzda ve serbestçe kodladığınızda kodu yeni uzaktan depoya itin.

3
Craig Myles

Bu kısa senaryo dizilerini yeni keşfediyorum. Yazar sizi temel işlemlerden geçirir ve biraz daha gelişmiş kullanımları gösterir.

3
ripper234

İşte bir veya daha fazla SVN deposunu git'e çevirecek ve GitHub'a itecek bağımlılıkları olmayan basit bir Shell betiği.

https://Gist.github.com/NathanSweet/7327535

Komut satırının yaklaşık 30 satırında: git SVN kullanarak klonlar, SVN :: ignore özelliklerinden bir .gitignore dosyası oluşturur, yalın bir git deposuna iter, SVN trunk'ını master olarak yeniden adlandırır, SVN etiketlerini git etiketlerine dönüştürür ve GitHub'a iter etiketleri korurken.

Bir düzine SVN deposunu Google Kodundan GitHub'a taşımak için çok acı çektim. Windows kullanmamın bir faydası olmadı. Ruby, eski Debian kutumda kırılmıştı ve Windows'ta çalışmasını sağlamak bir şakaydı. Diğer çözümler Cygwin yolları ile çalışamadı. Bir kere çalışmış olsam bile, etiketleri GitHub'da nasıl göstereceğimi çözemedim (sırrı - - follow-tags).

Sonunda, birbirine bağlı iki kısa ve basit senaryoyu bir araya getirdim ve harika çalışıyor. Çözümün bundan daha karmaşık olması gerekmez!

2
NateS

Başka bir yana, git-stav komutu git-svn dcommits ile gitmeye çalışırken bir nimettir.

Tipik bir işlem:

  1. git repo kur
  2. farklı dosyalar üzerinde biraz çalış
  3. git kullanarak, bazı çalışmalarını kontrol etmeye karar vermek
  4. svn-dcommit karar ver
  5. korktuğunu almak "kirli bir dizinle işlem yapamıyor" hatası.

Çözüm (git 1.5.3+ gerektirir):

git stash; git svn dcommit ; git stash apply
2
Gregg Lind

Ben bir Windows makinesindeyim ve tarihçeli (dalsız) bir SVN reposunu GIT deposuna transfer etmek için küçük bir Batch yaptım.

transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo

Belki de herkes kullanabilir. Bir TMP klasörü oluşturur, orada SVN deposunu git ile kontrol eder ve yeni Kökeni ekler ve iter ... ve klasörü tekrar siler.

@echo off 
SET FROM=%1 
SET TO=%2 
SET TMP=tmp_%random%

echo from:  %FROM% 
echo to:    %TO% 
echo tmp:   %TMP%

pause

git svn clone  --no-metadata --authors-file=users.txt %FROM% %TMP%  
cd %TMP% 
git remote add Origin %TO% 
git Push --set-upstream Origin master


cd .. 
echo delete %TMP% ... 
pause

rmdir /s /q %TMP%

Kullanıcı eşlemlerinizde kullanmaya devam etmek için users.txt dosyasına ihtiyacınız var

User1 = User One <[email protected]>
2
cljk

Git topluluğuna katkımı eklemek istedim. Tam içe aktarmayı otomatikleştiren basit bir bash betiği yazdım. Diğer geçiş araçlarından farklı olarak, bu araç jGit yerine yerel git özelliğini kullanır. Bu araç aynı zamanda büyük bir revizyon geçmişi ve/veya büyük miktarda bloğu olan depoları da destekler. Github aracılığıyla kullanılabilir:

https://github.com/onepremise/SGMS

Bu komut dosyası, SVN'de depolanan projeleri aşağıdaki biçimde dönüştürür:

/trunk
  /Project1
  /Project2
/branches
     /Project1
     /Project2
/tags
 /Project1
 /Project2

Bu program aynı zamanda popüler ve desteklenmektedir:

/Project1
     /trunk
     /branches
     /tags
/Project2
     /trunk
     /branches
     /tags

Her proje proje adına göre senkronize edilir:

Ex: ./migration https://svnurl.com/basepath project1

Repoyu tamamen dönüştürmek istiyorsanız, aşağıdaki sözdizimini kullanın:

Ex: ./migration https://svnurl.com/basepath .
1
Jason Huntley

Bu hedefe ulaşmak için farklı yöntemler vardır. Bunlardan bazılarını denedim ve Windows işletim sistemi üzerine kurulu sadece git ve svn ile çalışmayı gerçekten buldum.

Ön şartlar:

  1. pencerelerde git (bunu kullandım) https://git-scm.com/
  2. konsol araçları yüklü olan svn (svn kaplumbağa kullandım)
  3. SVN deponuzun döküm dosyasını kaydedin. svnadmin dump /path/to/repository > repo_name.svn_dump

Son hedefe ulaşmak için atılacak adımlar (geçmişe sahip tüm depoları bir git'e, önce yerel git'e, ardından uzaklara taşıyın)

  1. REPO_NAME_FOLDER cd REPO_NAME_PARENT_FOLDER dizininde boş bir depo oluşturun (konsol araçlarını veya tortoiseSVN'yi kullanarak), dumpfile.dump dosyasını REPO_NAME_PARENT_FOLDER dizinine koyun

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump Bu işlemi bekleyin, uzun olabilir

  3. Bu komut sessiz, bu yüzden ikinci cmd penceresini açın: svnserve -d -R --root REPO_NAME_FOLDER Neden sadece dosya kullanmıyorsunuz: /// ......? Neden sonraki komut Unable to open ... to URL: ile başarısız olur, https://stackoverflow.com/a/6300968/4953065

  4. Yeni klasör oluştur SOURCE_GIT_FOLDER

  5. cd SOURCE_GIT_FOLDER
  6. git svn klonu svn: // localhost/Bu işlem için bekleyin.

Sonunda ne bulduk?

Yerel depomuzu kontrol edelim:

git log

Önceki taahhütlerini gördün mü? Eğer evet ise - tamam

Artık kaynaklarınız ve eski svn tarihinizle tamamen işlevsel bir yerel git deposuna sahipsiniz. Şimdi, onu bir sunucuya taşımak istiyorsanız, aşağıdaki komutları kullanın:

git remote add Origin https://fullurlpathtoyourrepo/reponame.git
git Push -u Origin --all # pushes up the repo and its refs for the first time
git Push -u Origin --tags # pushes up any tags

Benim durumumda, etiketler komutuna ihtiyacım yok çünkü repomun etiketleri yok.

İyi şanslar!

0
Ruslan Makrenko

GitHub bir ithalatçıya sahip. Depoyu oluşturduktan sonra, URL'sini kullanarak mevcut bir depodan içe aktarabilirsiniz. Varsa kimlik bilgilerinizi isteyecektir ve oradan gidiniz.

Çalışırken yazarları bulacaktır ve onları GitHub'daki kullanıcılarla eşleştirebilirsiniz.

Şimdi birkaç depo için kullandım ve oldukça doğru ve çok daha hızlı! ~ 4000 taahhüt ile bir depo için 10 dakika sürdü ve arkadaşım dört gün sonra aldı!

0
Josh Benson

Git'i Subversion ile etkin bir şekilde kullanmagit-svn 'in nazik bir tanıtımıdır. Mevcut SVN depoları için git-svn bunu süper kolaylaştırıyor. Yeni bir depo başlatıyorsanız, ilk önce boş bir SVN deposu oluşturmak ve daha sonra git-svn kullanarak içeri aktarmak için ters yönde olduğundan çok daha kolaydır. Yeni bir Git deposu oluşturmak ve ardından SVN'ye aktarmak yapılabilir, ancak özellikle Git'te yeniyseniz ve taahhüt geçmişini korumayı umuyorsanız biraz acı vericidir.

0
burkestar

Buradaki birkaç cevap, https://github.com/nirvdrum/svn2git ifadesine atıfta bulunur, ancak büyük depolar için bu yavaş olabilir. https://github.com/svn-all-fast-export/svn2git komutunu kullanmaya çalıştım, bunun yerine aynı adı taşıyan ancak KDE'yi SVN'den Git'e geçirmek için kullandım.

Ayarlamak için biraz daha fazla iş var, ancak dönüşüm benim için yapıldığında diğer betiğin saatlerce harcadığı dakikalar aldı.

0
Zitrax

Windows için Ruby yükleyicisini indirin ve onunla en son sürümü yükleyin. Yolunuza Ruby çalıştırılabilir dosyaları ekleyin.

  • Svn2git'i kurun
  • Başlat menüsü -> Tüm programlar -> Ruby -> Komutu başlat Ruby ile sor
  • Sonra "gem install svn2git" yazın ve girin

    Subversion deposunu taşı

  • Ruby komut istemini açın ve dosyaların taşınacağı dizine gidin

    Sonra svn2git http: // [etki alanı name]/svn/[havuz kökü]

  • Projenin Git'e geçirilmesi projenin kod boyutuna bağlı olarak birkaç saat sürebilir.

  • Bu büyük adım, aşağıda belirtildiği gibi Git depo yapısının oluşturulmasına yardımcı olur.

    SVN (/ Project_components) trunk -> Git ana SVN (/ Project_components) şubeleri -> Git şubeleri SVN (/ Project_components) etiketleri -> Git etiketleri

Uzak depoyu oluşturun ve değişiklikleri itin.

0
Nanda

Aşağıdaki komut dosyasını tüm SVN depolarımın listesini içeren ve bunları Git'e dönüştüren bir metin dosyasını okumak için kullandım ve daha sonra çıplak bir Git havuzuna dönüştürmek için git clone --bare öğesini kullandım:

#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
 printf '%s\n' "$repo_name"
 Sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name
 Sudo git clone --bare /programs/git/$repo_name $repo_name.git
 Sudo chown -R www-data:www-data $repo_name.git
 Sudo rm -rf $repo_name
done <"$file"

list.txt şu şekildedir:

repo1_name
repo2_name

Users.txt şu şekildedir:

(no author) = Prince Rogers <[email protected]>

www-data Apache web sunucusu kullanıcısıdır ve değişiklikleri HTTP üzerinden itmek için izin gerekir.

0
Pedro Vicente

Svn alt modülünü/'MyModule' klasörünü, etiketleri ve dalları olmayan tarihçeyle git'e dönüştürme.

Svn yoksaymak listesini tutmak için adım 1'den sonra yukarıdaki yorumları kullanın

0
PShetty