Git への変換

変換

SVNからGitへのマイグレーションの次のステップでは、SVNリポジトリの内容を新しいGitリポジトリにインポートします。この作業には、ほとんどのGit製品に付属している git svnユーティリティを使用し、その結果生成されるリポジトリを svn-migration-scripts.jarを使用してクリーンアップします。

リポジトリのサイズが大きい場合、ローカルのSVNリポジトリをクローンする場合であっても、変換プロセスには長時間を要する場合があることに留意してください。参考として、masterに33,000件のコミットが存在する400MBのリポジトリの標準的な変換時間は約12時間です。

リポジトリのサイズがそれほど大きくない場合は、以下の作業はマイグレーションリーダーのローカルコンピュータ上で実行することができます。ただし、SVNリポジトリのサイズが非常に大きく、変換にかかる時間を短縮したい場合は、マイグレーションリーダーのローカルコンピュータではなく、SVN サーバー上でgit svn cloneを実行することもできます。これにより、ネットワーク接続を経由したクローン処理によって発生するオーバーヘッドを回避するこができます。

SVNリポジトリのクローン

git svn cloneコマンドによって、SVNリポジトリ内のトランク、ブランチ、タグが新しいGitリポジトリに変換されます。SVNリポジトリの構造によっては、このコマンドのオプションを変更する必要があります。

Gitマイグレーション: git svn cloneコマンド

標準のSVNレイアウト

SVNプロジェクトが標準的な/trunk/branches/tagsディレクトリレイアウトを使う場合、マニュアルでリポジトリ構造を指定する代わりに、--stdlayoutオプションを使うことができます。即ち、~/GitMigrationディレクトリで次のコマンドを実行します:

git svn clone --stdlayout --authors-file=authors.txt
<svn-repo>/<project> <git-repo-name>

ここで、<svn-repo>はマイグレーション対象のSVN リポジトリのURI、<project>はインポートするプロジェクトの名前、<git-repo-name>は新しいGitリポジトリのディレクトリ名です。

例えば、https://svn.atlassian.comでホストされているConfluenceという名称のプロジェクトの移行を行う場合、次のコマンドを実行します:

git svn clone --stdlayout --authors-file=authors.txt
 https://svn.atlassian.com/Confluence ConfluenceAsGit

非標準のSVNレイアウト

SVNリポジトリのレイアウトが非標準的な場合、--trunk--branches--tagsコマンドラインオプションを使用して、トランク、ブランチ、タグの場所を指定する必要があります。例えば、ブランチが /branchesディレクトリと/bugfixesディレクトリに保存されている場合、次のコマンドを実行します:

git svn clone --trunk=/trunk --branches=/branches
--branches=/bugfixes --tags=/tags --authors-file=authors.txt
<svn-repo>/<project> <git-repo-name>

新しいGitリポジトリの検査

git svn cloneコマンドの処理 (これには時間がかかる場合があります) が完了すると、~/GitMigration<git-repo-name>という新しいディレクトリが作成されます。これが変換後のGitリポジトリです。ここから<git-repo-name>に移動すれば、標準的なGitコマンドを実行して、プロジェクトの内容を確認することができます。

ブランチとタグが新しいGitリポジトリにインポートされる方法には留意する必要があります。SVNブランチはgit branchコマンドの出力には表示されず、またSVNタグはgit tagコマンドの出力に表示されません。しかし、git branch -rを実行するとSVNリポジトリのすべてのブランチとタグが表示されます。git svn cloneコマンドを実行すると、SVNブランチはリモートブランチとしてインポートされ、SVNタグはtags/というプレフィックスが付いたリモートブランチとしてインポートされます。

Gitマイグレーション: クローンされたGitリポジトリの構造

この動作により、一部の双方向同期の手順が簡易化されますが、一方向のマイグレーションGitを試みる場合は混乱が生じる場合があります。このため、次にこれらのリモートブランチをローカルブランチと実際のGitタグに変換する作業が必要となります。

新しいGitリポジトリのクリーンアップ

svn-migration-scripts.jar内にあるclean-gitスクリプトを使用して、SVNブランチをローカルのGitブランチに、 SVN タグを完全なGitタグに変換します。この処理は「不可逆的」であり、GitリポジトリからSVNリポジトリにコミットを戻すことはできなくなることに留意してください。

このマイグレーションガイドの通りに作業しているのであれば、同期はSVNからGitへの一方向であり (マイグレーションステップの完了まではGitリポジトリはリードオンリーで使用します)、これが問題になることはありません。ただし、マイグレーション処理中にGitリポジトリにコミットを行なう予定があり、かつSVNリポジトリに反映させる必要がある場合は、下に示すコマンドを実行してはなりません。この操作は上級者向けであり、通常のプロジェクトにおいてはその使用を推奨しません。

クリーンアップスクリプトの処理内容を確認するには、~/GitMigration/<git-repo-name>において次のコマンドを実行します:

java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git

このスクリプトを実行するとすべての変換処理内容が表示されますが、実際には変換は実行されません。変換を実行する場合は --forceオプションを使用して次のようにします:

java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git --force

このスクリプト処理が完了すると、git branchの出力にはすべての SVN ブランチが表示され、git tagの出力にはすべての SVN タグが表示されるようになります。これらが表示された場合、それはSVN リポジトリから Git リポジトリへの変換が成功したことを意味します。

まとめ

このステップでは、git svn cloneコマンドを使用して SVN リポジトリを新たな Git リポジトリにクローンする方法、および svn-migration-scripts.jarを使用してその結果生成されるリポジトリをクリーンアップする方法について説明しました。次のステップでは、SVN リポジトリにコミットが追加された場合に、新たな Git リポジトリを SVN リポジトリに同期させる方法について学習します。このプロセスは「変換」の場合と似ていますが、移行期間中においてはワークフロー上の重要な問題を考慮する必要があります。

Git を学習する準備はできていますか?

この対話式チュートリアルを利用しましょう。

今すぐ始める