履歴付きのSVNリポジトリを新しいGitリポジトリに移行するにはどうすればよいですか? 質問する

履歴付きの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

私はそれがそれほど単純であるとは思っていませんし、単一のコマンドであるとも思っていません。しかし、私はそれが何かを説明しようとするのではなく、この例に基づいてどのような手順を実行するかを示すだけであることを期待しています。

ベストアンサー1

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

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

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

svn log -q | awk -F '|' '/^r/ {gsub(/ /, "", $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

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

一般的なプロトコルはすべて許可されています: svn://http://https://。URLはベースリポジトリをターゲットにする必要があります。http://svn.mycompany.com/myrepo/リポジトリURL 文字列には、、またはを含めることはできません。/trunk/tag/branches

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

また、フラグを省略すると--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

リポジトリに他のリモート ブランチを保持したい場合は、それぞれに対してローカル ブランチを手動で作成する必要があります (trunk/master はスキップします)。これを行わないと、最終ステップでブランチが複製されません。

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

タグはブランチとしてインポートされます。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

おすすめ記事