web-dev-qa-db-ja.com

履歴付きのSVNリポジトリを新しいGitリポジトリに移行する方法を教えてください。

Gitのマニュアル、FAQ、Git - SVNのクラッシュコースなどを読んでみましたが、彼ら全員がこれとそれを説明していますが、次のような簡単な説明はありません。

SVNリポジトリ(svn://myserver/path/to/svn/repos

Gitリポジトリは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

私はそれがそれほど単純であることを期待していません、そして私はそれが単一のコマンドであることを期待していません。しかし、私はそれが何も説明しようとしないことを期待しています - 単にこの例を考えてどのようなステップをとるべきかを言うために。

1453
Milan Babuškov

魔法:

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

GitとSVNはまったく異なる動作をします。あなたはGitを学ぶ必要があります、そしてSVN上流からの変更を追跡したいのなら、あなたはgit-svnを学ぶ必要があります。 git-svnのmanページには良い例があります。

$ git svn --help
513
jfm3

SVNユーザーをGitにマッピングするためのユーザーファイル(つまりusers.txt)を作成します。

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

このワンライナーを使用して、既存のSVNリポジトリからテンプレートを構築することができます。

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

ファイル内に見つからないSVNユーザーが見つかった場合、SVNは停止します。しかしその後、ファイルを更新して中断した場所からピックアップすることができます。

リポジトリからSVNデータを取得します。

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

このコマンドはdest_dir-tmpに新しいGitリポジトリを作成し、SVNリポジトリの取得を開始します。 "--stdlayout"フラグはあなたが共通の "trunk /、branches /、tags /" SVNレイアウトを持つことを意味することに注意してください。レイアウトが異なる場合は、--tags--branches--trunkオプション(一般的にはgit svn help)に慣れてください。

svn://http://https://のすべての一般的なプロトコルが許可されています。 URLは http://svn.mycompany.com/myrepo/repository のようなベースリポジトリをターゲットにする必要があります。 /trunk/tag/branchesnotにする必要はありません。

このコマンドを実行した後は、操作が「ハング/フリーズ」しているように見えることがよくあります。新しいリポジトリを初期化した後も長時間動かなくなることがあるのはごく普通です。やがてあなたはそれが移行していることを示すログメッセージを見るでしょう。

--no-metadataフラグを省略すると、Gitは対応するSVNのリビジョンに関する情報をコミットメッセージに追加します(つまりgit-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>)。

ユーザー名が見つからない場合は、users.txtファイルを次のように更新してください。

cd dest_dir-tmp
git svn fetch

大規模プロジェクトの場合は、すべてのSubversionコミットが取得されるまで、最後のコマンドを数回繰り返す必要があります。

git svn fetch

完了すると、GitはSVNのtrunkを新しいブランチにチェックアウトします。他のブランチはすべてリモートとして設定されています。他のSVNブランチを見ることができます:

git branch -r

他のリモートブランチをリポジトリに保存したい場合は、それぞれにローカルブランチを手動で作成します。これを行わないと、ブランチは最後のステップで複製されません。

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

タグはブランチとしてインポートされます。ローカルブランチを作成し、タグを作成し、それらをGitのタグとして使用するには、ブランチを削除する必要があります。タグ "v1"でそれを行うには:

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

GIT-SVNリポジトリをクリーンなGitリポジトリにクローンします。

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

リモートブランチから以前に作成したローカルブランチは、リモートブランチとして新しいクローンリポジトリにコピーされただけです。 (trunk/masterを飛ばしてください。)あなたが飼いたい枝ごとに:

git checkout -b local_branch Origin/remote_branch

最後に、今削除された一時的なリポジトリを指すあなたのきれいなGitリポジトリからリモートを削除してください:

git remote rm Origin
1512
cmcginty

SubversionリポジトリをGitリポジトリにきれいに移行する 。まず~/authors.txtのように、あなたのSubversionコミット作者名をGitコミッターにマッピングするファイルを作成する必要があります。

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

その後、SubversionデータをGitリポジトリにダウンロードできます。

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

Macを使用している場合は、git-svnをインストールすることで、MacPortsからgit-core +svnを取得できます。

Subversionリポジトリが希望するgitリポジトリと同じマシン上にある場合は、initステップにこの構文を使用できます。それ以外はすべて同じです。

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

私は svn2gitスクリプト を使用しましたが、魅力的に動作します。

69

私は、Git-svnを常に使うことを試みる前にGitに慣れることをお勧めします。

ただし、すべての履歴を含む単純な移行のために、ここにいくつかの簡単な手順があります。

ローカルリポジトリを初期化します。

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

リビジョンのインポートを開始したい時期をマークします。

git svn fetch -r42

(またはすべてのrevに "git svn fetch"を実行してください)

それ以降、実際にはすべてを取得します。

git svn rebase

インポートの結果はGitkで確認できます。これがWindows上で動作するのか、OSXおよびLinux上で動作するのかはわかりません。

gitk

SVNリポジトリをローカルに複製した場合は、コラボレーションを容易にするためにそれを一元化されたGitリポジトリにプッシュすることをお勧めします。

最初に空のリモートレポジトリを作成してください(おそらく GitHub ?にあります):

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

次に、必要に応じてメインブランチを同期して、両方に新しいものが含まれている場合にpull操作でリモートマスターとローカルマスターを自動的にマージします。

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

その後、あなたは私自身のgit_remote_branchツールを試してみることに興味があるかもしれません。

最初の説明記事: " Gitリモートブランチ "

最新版のフォローアップ: " git_remote_branchと共同作業をするgitの時間 "

57
webmat

SubversionからGitへのスムーズな移行のための(または同時に両方を使うための)新しい解決策があります: SubGit

私は自分自身でこのプロジェクトに取り組んでいます。私たちのリポジトリではSubGitを使用しています - 私のチームメイトの何人かはGitといくつかのSubversionを使用していて、これまでのところそれは非常にうまく機能します。

SubGitでSubversionからGitに移行するには、実行する必要があります。

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

その後、Gitリポジトリをsvn_repos/.gitに取得してクローンを作成するか、またはSubversionとこの新しいGitリポジトリを一緒に使用し続けることができます。

Subversionリポジトリに複数のプロジェクトが含まれている場合、svn_repos/gitディレクトリに複数のGitリポジトリが作成されます。実行前に翻訳をカスタマイズするには、次の手順に従います。

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

SubGit を使用すると、純粋なGit(git-svnではなく)に移行して、必要に応じてSubversionを維持したまま使用し始めることができます(例えば、既に構成済みのビルドツールの場合)。

お役に立てれば!

30

公式の git-svnのマンページ を参照してください。特に、 "基本的な例"を見てください。

Subversionで管理されたプロジェクト全体の追跡と貢献(トランク、タグ、ブランチを完備):

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

Pro Git 8.2はそれを説明しています: http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git

13
kdahlhaus

SubGit (対死のブルースクリーン)

subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

それはすべてです。

+ SVNからアップデートするには、最初のコマンドで作成したGitリポジトリ。

subgit import  directory/path/Local.git.Repo

私は巨大なリポジトリのためにGitに即座に移行する方法を使いました。
もちろん、準備が必要です。
しかし、あなたは開発プロセスを止めてはいけません。

これが私のやり方です。

私の解決策はこんな感じです:

  • SVNをGitリポジトリに移行します
  • チームがに切り替える直前にGitリポジトリを更新します。

大きなSVNリポジトリでは移行に時間がかかります。
しかし、完了した移行の更新はほんの数秒です。

もちろん、私は SubGit を使っています、ママ。 git-svnは私を作る Blue Screen of Death 。絶えず。そしてgit-svnはGitの " filename too long "致命的なエラーで私を退屈させています。

STEPS

1。SubGitのダウンロード

2.移行コマンドと更新コマンドを準備します。

私たちがWindowsのためにそれをするとしましょう(それはLinuxへの移植は自明です)。
SubGitのインストールbinディレクトリ(subgit-2.X.X\bin)に、2つの.batファイルを作成します。

移行のためのファイル/コマンドの内容

start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

"start"コマンドはここではオプションです(Windows)。 SubGitの完了後、起動時にエラーを確認してシェルを開いたままにすることができます。

ここに追加することができます git-svnに似た追加のパラメータ 。 SVN作者の電子メールアドレスのドメインを修正するために - default-domain myCompanyDomain.comのみを使用しています。
私は標準的なSVNリポジトリの構造(trunk/branches/tags)を持っています、そして私たちは "著者マッピング"に問題を抱えていませんでした。だから私はもう何もしていません。

(ブランチなどのタグを移行する場合、またはSVNに複数のブランチ/タグフォルダがある場合は、より冗長なSubGitを使用することを検討してください。 approach

ヒント1:--minimal-revision YourSvnRevNumberを使用して、状況がどのように速く再現されるかを確認します(ある種のデバッグ)。特に有用なのは、解決された著者名またはEメールを見ることです。
または、移行履歴の深さを制限します。

ヒント2:移行が中断される可能性があります(Ctrl + C次の更新コマンド/ファイルを実行して復元します。
私はこれを大きなリポジトリにすることはお勧めしません。 「メモリ不足Java + Windows例外」を受け取りました。

ヒント3:結果のベアリポジトリのコピーを作成した方がいいでしょう。

更新するファイル/コマンドの内容

start    subgit import  directory/path/Local.git.Repo

最後のチームのGitリポジトリへのコミットを取得したいときはいつでも実行できます。

警告!裸のリポジトリには触れないでください(例えばブランチの作成)。
次の致命的なエラーが発生します。

回復不能なエラー:同期がとれていないため同期できません... SubversionリビジョンのGitへの翻訳のコミット...

3.最初のコマンド/ファイルを実行します。大きなレポジトリには長い時間がかかるでしょう。私の控え目なリポジトリのための30時間。

それはすべてです。
あなたは2番目のファイル/コマンドを実行することによっていつでもSVNからGitリポジトリをいつでも更新することができます。開発チームをGitに切り替える前に。
ほんの数秒かかります。



もう1つ便利な作業があります。

ローカルのGitリポジトリをリモートのGitリポジトリにプッシュします

あなたのケースですか?続けましょう。

  1. あなたのリモコンを設定する

実行します。

$ git remote add Origin url://your/repo.git
  1. 巨大なローカルGitリポジトリをリモートリポジトリに最初に送信する準備をします。

デフォルトでは、Gitは大きなチャンクを送信できません。 致命的:リモートエンドが突然ハングアップしました

実行しましょう。

git config --global http.postBuffer 1073741824

524288000 - 500 MB 1073741824 - 1 GBなど.

あなたのローカルを修正してください 証明書の問題 。あなたのgit-serverが壊れた証明書を使っているなら。

無効にしました 証明書

またあなたのGitサーバーには リクエスト量の制限を修正する必要がある があるかもしれません。

  1. すべての移行をプッシュする チームのリモートGitリポジトリへ。

ローカルのGitで実行します。

git Push Origin --mirror

git Push Origin '*:*'古いGitバージョンの場合)

次のように表示された場合:エラー:gitを起動できません:そのようなファイルやディレクトリはありません...私の場合、リポジトリを完全に再作成すると解決できます( 30時間)次のコマンドを試すことができます

git Push Origin --all
git Push Origin --tags

または Gitを再インストール私には無用です)。あるいは、あなたが持っているすべてのタグからブランチを作成してプッシュすることもできます。または、または、または...

13
it3xl

リスポリジョン

複雑な場合には、 Eric S. Raymond による担当外科医が選択のツールです。 SVNに加えて、それはfast-exportフォーマット、そして _ cvs _ を介して他の多くのバージョン管理システムをサポートします。作者は EmacsFreeBSD のような古代のリポジトリの変換に成功したと報告しています。

このツールは明らかに 長い歴史を持つ難しいリポジトリレイアウトのためでさえも(ほぼSVNのsvn:ignoreプロパティを.gitignoreファイルに変換するような)ほぼ完全な変換を目指しています 多くの場合、他のツールの方が使いやすいかもしれません。

reposurgeonコマンドラインのドキュメントを掘り下げる前に、変換プロセスを段階的に説明している優れた DVCS移行ガイド を必ず読んでください。

9
krlmlr

アトラシアンのウェブサイト上のこのガイドは私が見つけた最も良いものの1つです:

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

このツール - https://bitbucket.org/atlassian/svn-migration-scripts - は、とりわけauthors.txtを生成するのにも本当に便利です。

7
Andrew B

あなたがインストールする必要があります

git
git-svn

このリンクからコピーしました http://john.albin.net/git/convert-Subversion-to-git

1. Subversionの全コミッターのリストを取得する

Subversionは各コミットのユーザー名をリストするだけです。 Gitのコミットにはもっと豊富なデータがありますが、最も簡単な方法では、コミットの作成者は名前とEメールアドレスをリストに含める必要があります。デフォルトではgit-svnツールはSVNユーザー名を作者とEメールの両方のフィールドにリストするだけです。しかし、少し手を加えるだけで、すべてのSVNユーザーのリストと、それに対応するGit名とEメールの一覧を作成できます。このリストは普通のsvnユーザ名を適切なGitコミッタに変換するためにgit-svnによって使われることができます。

ローカルのSubversionチェックアウトのルートから、次のコマンドを実行してください。

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

これにより、すべてのログメッセージが取得され、ユーザー名が取り出され、重複するユーザー名が削除され、ユーザー名が並べ替えられ、それらが「authors-transform.txt」ファイルに配置されます。ファイルの各行を編集します。たとえば、次のように変換します。

jwilkins = jwilkins <jwilkins>

これに:

jwilkins = John Albin Wilkins <[email protected]>

2. git-svn を使ってSubversionリポジトリをクローンします。

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

これで標準のgit-svn変換が行われ(手順1で作成したauthors-transform.txtファイルを使用)、gitリポジトリはホームディレクトリ内の“〜/ temp”フォルダに配置されます。

3. svn:ignore propertiesを.gitignore に変換します。

あなたのsvnリポジトリがsvn:ignoreプロパティを使っていたのなら、以下のようにして簡単にこれを.gitignoreファイルに変換できます。

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

4.リポジトリをベアGitリポジトリにプッシュする

まず、裸のリポジトリを作成し、そのデフォルトブランチをsvnの「トランク」ブランチ名と一致させます。

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

次に、一時リポジトリを新しいベアリポジトリにプッシュします。

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

〜/ tempリポジトリを安全に削除することができます。

5. "trunk"ブランチの名前を "master"に変更します

あなたの主な開発ブランチはSubversionにあった名前と一致する“ trunk”という名前になります。次のようにして、Gitの標準的な「マスター」ブランチに名前を変更します。

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

6.ブランチとタグを整理する

git-svnは、SubversionのタグすべてをGitの「タグ/名前」の形式の非常に短いブランチにします。以下を使用して、これらすべてのブランチを実際のGitタグに変換します。

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

このステップでは少し入力が必要になります。 :-)しかし、心配しないでください。あなたのunixシェルは、git for-each-refで始まる特別に長いコマンドのための二次プロンプトを提供するでしょう。

7
Valarpirai

Git、SVN、およびbashを使用した、やや拡張された回答。これにはtrunk/branches/tagsディレクトリレイアウトで従来のレイアウトを使用しないSVNリポジトリのためのステップが含まれます(SVNはこの種のレイアウトを強制するためにまったく何もしません)。

最初にこのbashスクリプトを使用して、あなたのSVNリポジトリをスキャンして、貢献してくれたさまざまな人々を探し、マッピングファイル用のテンプレートを生成します。

#!/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 <USER@DOMAIN>";
done

これを使用して、開発者が git config properties user.nameおよびuser.emailを使用して設定したsvnのユーザー名をユーザー名および電子メールにマッピングするauthorsファイルを作成します。

それから git svn にsvnレポジトリをgitレポジトリにクローンして、マッピングについて教えます。

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

Git svnは存在する全てのタグやブランチの全てのリビジョンを個別にチェックアウトするので、これは非常に長い時間がかかる可能性があります。 (SVNのタグは実際には単なるブランチなので、Gitではそのようになります)。不要なSVNの古いタグやブランチを削除することでこれをスピードアップできます。

同じネットワーク内または同じサーバー上のサーバーでこれを実行すると、実際にこれを高速化することもできます。また、何らかの理由でこのプロセスが中断された場合は、 can を使用して再開できます。

git svn rebase --continue

多くの場合、これで終わりです。しかしあなたのSVNリポジトリがSVNにディレクトリを持っていて、gitブランチに入れたいという、従来とは異なるレイアウトがあるのであれば、いくつか追加のステップを踏むことができます。

最も簡単な方法は、慣例に従って新しいSVNレポジトリをサーバに作成し、svn copyを使用してディレクトリをトランクまたはブランチに配置することです。これは、あなたのディレクトリがリポジトリのルートにある場合、唯一の方法かもしれません。このgit svnを最後に試したとき、単にチェックアウトを拒否しました。

Gitを使ってこれを行うこともできます。 git svn cloneには単にgitブランチに置きたいディレクトリを使います。

実行後

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

これにはGit 1.7以上が必要であることに注意してください。

6
thoutbeckers

GitHubは SVNリポジトリからインポートする という機能を持ちます。私は試したことがない。

6
webmat

Svnタグをgitタグに、svnブランチをgitブランチに変換するなど、svnをgitに変換するためのステップバイステップガイド( here )を投稿しました。

短縮版:

1)特定のリビジョン番号からsvnをクローンします。 (リビジョン番号はあなたが移行したい最も古いものでなければなりません)

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

2)SVNデータを取得します。このステップは、最も時間がかかるものです。

cd gitreponame
git svn fetch

エラーなく終了するまでgit svn fetchを繰り返します。

3)マスターブランチを更新する

git svn rebase

4)参照をコピーしてsvnブランチからローカルブランチを作成する

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

5)SVNタグをGitタグに変換する

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)githubのようなより良い場所にリポジトリを置く

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

あなたがより多くの詳細が欲しいならば、私の ポスト を読むか、または私に尋ねてください。

5

以下のようにgit svn cloneコマンドを使用できます。

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

上記のコマンドはSVNコミットから作成者ファイルを作成します。

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

SVNプロジェクトが作成されたとき、上記のコマンドはあなたに最初のリビジョン番号を与えるでしょう。

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

上記のコマンドはGitリポジトリをローカルに作成します。

問題は、ブランチやタグをPushに変換しないことです。手動でそれらをしなければならないでしょう。下記はブランチの例です。

$ 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
$

タグの場合:

$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
$

マスター、ブランチ、タグをリモートのgitリポジトリにプッシュしましょう。

$ 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ユーティリティ

svn2git utilityはブランチとタグを使った手作業を取り除きます。

コマンドSudo gem install svn2gitを使用してインストールしてください。それ以降はコマンドを実行してください。

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

今、あなたは枝、タグをリストして、そして(彼・それ)らを簡単に押すことができます。

$ 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の枝とタグを持っていると想像してください、明らかにsvn2gitはあなたに多くの時間を節約するでしょう、そしてそれが私がそれをネイティブコマンドよりも好きである理由です。これはネイティブのgit svn cloneコマンドを囲むNiceラッパーです。

完全な例については、my blogエントリ を参照してください。

5
Pankaj

TortoiseGitはこれを行います。このブログ記事を参照してください: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients

ええ、私はリンクで答えることは素晴らしいではないことを知っていますが、それは解決策ですね。

4
CAD bloke

GitLab usersについてSVNからの移行方法についての要旨をここに示しました。

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

SVNからGitLabに移行する手順

セットアップ

  • SVNはsvn.domain.com.auでホストされています。
  • SVNはhttp経由でアクセス可能です(他のプロトコルでも動作するはずです)。
  • GitLabはgit.domain.com.auおよび:でホストされています。
    • グループはネームスペースdev-teamで作成されます。
    • 少なくとも1つのユーザーアカウントが作成され、グループに追加され、移行に使用されているアカウントのSSHキーを持ちます(ssh [email protected]を使用したテスト)。
    • プロジェクトfavourite-projectdev-team名前空間に作成されます。
  • ファイルusers.txtには、関連するユーザーの詳細が1行に1ユーザーずつusername = First Last <[email protected]>の形式で入っています。ここで、usernameはSVNログで指定されたユーザー名です。 (詳細については、参考文献のセクションの最初のリンクを参照してください。特に、ユーザーCaseyによる回答)。

バージョン

  • Subversionバージョン1.6.17(r1128011)
  • gitバージョン1.9.1
  • GitLabバージョン7.2.1 ff1633f
  • Ubuntuサーバー14.04

コマンド

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

それでおしまい! GitLabのWeb UIでプロジェクトページをリロードすると、コミットとファイルがすべて一覧表示されます。

ノート

  • 未知のユーザーがいる場合、git svn cloneコマンドは停止します。その場合、更新のusers.txtcd favourite-project、およびgit svn fetchは停止した場所から続行されます。
  • SVNリポジトリ用の標準のtrunk-tags-branchesレイアウトが必要です。
  • git svn cloneコマンドに指定されたSVN URLは、trunk/tags/およびbranches/のすぐ上のレベルで停止します。
  • git svn cloneコマンドは、上部にいくつかの警告を含む、大量の出力を生成します。私は警告を無視しました。
3
leftclickben

SourceTreeを使用している場合は、アプリから直接これを実行できます。 [ファイル] - > [新規作成]の順に選択し、次の操作を行います。

  1. 「Source Path/URL」としてリモートSVN URLを入力します。
  2. 指示に従って資格情報を入力します。
  3. 「インストール先パス」としてローカルフォルダの場所を入力します。
  4. 名前を付けます。
  5. 詳細オプションでは、「タイプのローカルリポジトリを作成する」のドロップダウンから「Git」を選択します。
  6. 複製元のリビジョンをオプションで指定できます。
  7. クローンをヒット。

SourceTreeでレポジトリを開くと、コミットメッセージも移行されたことがわかります。

それではRepository - > Repository Settingsに行き、新しいリモートリポジトリの詳細を追加してください。望むならSVNリモートを削除してください(私はこれを "Edit Config File"オプションで行いました。

準備ができたら、コードを新しいリモートリポジトリにプッシュして、自由にコード化します。

3
Craig Myles

私はこれを強くお勧めします スクリーンキャストの短いシリーズ 私はちょうど発見しました。作者は基本的な操作を通してあなたを歩き、そしていくつかのより高度な用法を紹介します。

3
ripper234

これは、1つ以上のSVNリポジトリをgitに変換し、それらをGitHubにプッシュする、依存関係のない単純なシェルスクリプトです。

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

約30行のスクリプトで、git SVNを使用したクローン作成、SVN :: ignoreプロパティから.gitignoreファイルの作成、ベアgitリポジトリへのプッシュ、SVNトランクのマスターへの名前変更、SVNタグのgitタグへの変換、およびGitHubへのプッシュを行います。タグを保存しながら。

私は1ダースのSVNリポジトリをGoogle CodeからGitHubに移動することに大変苦労しました。それは私がWindowsを使ったことを助けにはならなかった。 Rubyは私の古いDebianマシンではいろいろな種類のものが壊れていたので、Windows上で動かすのは冗談でした。他の解決策はCygwinパスではうまくいきませんでした。何かがうまくいったとしても、そのタグをGitHubに表示させる方法はわかりませんでした(秘密は--follow-tagsです)。

最後に、上記でリンクされた2つの短くて単純なスクリプトをまとめました、そしてそれは素晴らしい働きをします。解決策はそれ以上複雑である必要はありません。

2
NateS

別の余談として、git-svn dcommitsでgitしようとしたときのgit-stashコマンドは天の恵みです。

典型的なプロセス:

  1. gitリポジトリを設定する
  2. 異なるファイルに対していくつかの作業を行う
  3. gitを使って、作業の一部をチェックインすることにします。
  4. svn-dcommitに決める
  5. 恐ろしい "ダーティインデックスをコミットできません"エラーが発生します。

解決策(git 1.5.3以降が必要です):

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

私はWindowsマシンを使っていて、履歴付きのSVNリポジトリ(ブランチは除く)をGITリポジトリに転送するための小さなバッチを作成しました。

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

おそらく誰でもそれを使うことができます。 TMPフォルダを作成し、そこにSVNリポジトリをgitでチェックアウトし、新しいOriginを追加してそれをプッシュします...そしてフォルダを再び削除します。

@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%

あなたはまだあなたのようなあなたのユーザーマッピングでusers.txtを必要とします

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

私はGitコミュニティに私の貢献を加えたいと思いました。私は完全なインポートを自動化する簡単なbashスクリプトを書きました。他の移行ツールとは異なり、このツールはjGitではなくネイティブのgitに依存しています。このツールは、大きな改訂履歴や大きなBLOBを持つリポジトリもサポートします。それはgithub経由で利用可能です:

https://github.com/onepremise/SGMS

このスクリプトは、SVNに格納されているプロジェクトを次の形式で変換します。

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

この方式も人気があり、同様にサポートされています。

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

各プロジェクトはプロジェクト名によって同期されます。

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

完全リポジトリを変換したい場合は、次の構文を使用してください。

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

この目的を達成するためのさまざまな方法があります。私はそれらのいくつかを試してみました、そして本当にgitとsvnがWindows OSにインストールされたもので動くものを見つけました。

前提条件:

  1. windows上でgit(私はこれを使っています) https://git-scm.com/ /
  2. コンソールツールがインストールされたsvn(私は亀svnを使っていました)
  3. SVNリポジトリのファイルをダンプします。 svnadmin dump /path/to/repository > repo_name.svn_dump

最終目標を達成するためのステップ(履歴のあるすべてのリポジトリをgitに移動し、まずローカルのgitに移動し、次にリモートに移動します)

  1. REPO_NAME_FOLDER cd REPO_NAME_PARENT_FOLDERディレクトリに空のリポジトリを(コンソールツールまたはtortoiseSVNを使用して)作成し、dumpfile.dumpをREPO_NAME_PARENT_FOLDERに配置します。

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dumpこの操作を待ちます。長くなる可能性があります

  3. このコマンドは表示されないので、2番目のcmdウィンドウを開きます。svnserve -d -R --root REPO_NAME_FOLDERなぜfile:/// ......を使用しないのですか。 answer https://stackoverflow.com/a/6300968/4953065 のおかげで、次のコマンドはUnable to open ... to URL:で失敗します。

  4. 新しいフォルダを作成します。SOURCE_GIT_FOLDER

  5. cd SOURCE_GIT_FOLDER
  6. git svn clone svn:// localhost /この操作を待ちます。

最後に、我々は何を手に入れましたか?

私たちのローカルリポジトリをチェックしましょう:

git log

以前のコミットを見ますか?もしそうなら - 大丈夫

だから今あなたはあなたの情報源と古いsvnの歴史を持つ完全に機能的なlocal gitリポジトリを持っています。さて、もしあなたがそれをあるサーバに移動したいのなら、以下のコマンドを使ってください。

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

私の場合は、タグが必要ではありません。

がんばろう!

0
Ruslan Makrenko

GitHubにはインポーターがあります。リポジトリを作成したら、そのURLを介して既存のリポジトリからインポートできます。該当する場合、それはあなたの資格情報を要求し、そこから行きます。

実行中は作者が見つかるので、GitHub上でそれらを単にユーザーにマッピングすることができます。

私は今、いくつかのリポジトリにそれを使っています、そしてそれはかなり正確で、はるかに速いです! 4000コミットまでのリポジトリを作成するのに10分かかりました。それから、4日後に私の友人がかかりました。

0
Josh Benson

SubversionでGitを効果的に使用するは、git-svnの入門書です。既存のSVNリポジトリにとって、git-svnはこれをとても簡単にします。新しいリポジトリを始めているのであれば、最初に空のSVNリポジトリを作成し、次にgit-svnを使ってインポートするほうが、逆の方向に進むよりもはるかに簡単です。新しいGitリポジトリを作成してからSVNにインポートすることはできますが、特にGitに慣れておらず、コミット履歴を保存したい場合は、少し面倒です。

0
burkestar

ここにいくつかの答えは https://github.com/nirvdrum/svn2git を参照します、しかし大きいリポジトリのためにこれは遅くなることがあります。 https://github.com/svn-all-fast-export/svn2git を使用してみました。これは、まったく同じ名前のツールですが、KDEをSVNからGitに移行するために使用されていました。

セットアップには少し手間がかかりますが、変換が完了したときに他のスクリプトが何時間もかかった時間が数分かかりました。

0
Zitrax

Windows用のRubyインストーラーをダウンロードし、それと共に最新版をインストールしてください。あなたのパスにRuby実行ファイルを追加してください。

  • Svn2gitをインストールする
  • スタートメニュー - >すべてのプログラム - > Ruby - >コマンドの開始Rubyでプロンプトを出す
  • それから「gem install svn2git」と入力して、

    Subversionリポジトリを移行します

  • Rubyのコマンドプロンプトを開き、ファイルを移行するディレクトリに移動します。

    それからsvn2git http:// [ドメイン 名前]/svn/[リポジトリルート]

  • プロジェクトのコードサイズによっては、プロジェクトをGitに移行するのに数時間かかることがあります。

  • この主なステップは、後述のGitリポジトリ構造の作成に役立ちます。

    SVN(/ Project_components)トランク - > GitマスターSVN(/ Project_components)ブランチ - > GitブランチSVN(/ Project_components)タグ - > Gitタグ

リモートリポジトリを作成して変更をプッシュします。

0
Nanda

以下のスクリプトを使用して、すべてのSVNリポジトリのリストを含むテキストファイルを読み取り、それらをGitに変換し、後でgit clone --bareを使用してベアGitリポジトリに変換します。

#!/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の形式は以下のとおりです。

repo1_name
repo2_name

Users.txtの形式は次のとおりです。

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

www-dataはApache Webサーバーのユーザーであり、HTTP経由で変更をプッシュするには許可が必要です。

0
Pedro Vicente

Svn submodule/folder 'MyModule'をタグやブランチのない履歴付きのgitに変換します。

Svn ignore listを保持するには、ステップ1の後に上記のコメントを使用してください。

0
PShetty