Git convert: A step in migration from SVN to Git
SVNからGitへのマイグレーションの次のステップでは、SVNリポジトリの内容を新しいGitリポジトリにインポートします。この作業には、ほとんどのGit製品に付属している git svn
ユーティリティを使用し、その結果生成されるリポジトリを svn-migration-scripts.jar
を使用してクリーンアップします。
リポジトリのサイズが大きい場合、ローカルの SVN リポジトリをクローンする場合であっても、変換プロセスには長時間を要する場合があることに留意してください。参考として、main に 33,000 件のコミットが存在する 400MB のリポジトリの標準的な変換時間は約 12 時間です。
リポジトリのサイズがそれほど大きくない場合は、以下の作業はマイグレーションリーダーのローカルコンピュータ上で実行することができます。ただし、SVNリポジトリのサイズが非常に大きく、変換にかかる時間を短縮したい場合は、マイグレーションリーダーのローカルコンピュータではなく、SVN サーバー上でgit svn clone
を実行することもできます。これにより、ネットワーク接続を経由したクローン処理によって発生するオーバーヘッドを回避するこができます。
SVNリポジトリのクローン
git svn clone
コマンドによって、SVNリポジトリ内のトランク、ブランチ、タグが新しいGitリポジトリに変換されます。SVNリポジトリの構造によっては、このコマンドのオプションを変更する必要があります。
関連資料
Git リポジトリ全体を移動する方法
ソリューションを見る
Bitbucket Cloud での Git の使用方法についてのチュートリアルです。
標準の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 リポジトリです。ここから
に移動すれば、標準的な Git コマンドを実行して、プロジェクトの内容を確認できます。
ブランチとタグが新しいGitリポジトリにインポートされる方法には留意する必要があります。SVNブランチはgit branch
コマンドの出力には表示されず、またSVNタグはgit tag
コマンドの出力に表示されません。しかし、git branch -r
を実行するとSVNリポジトリのすべてのブランチとタグが表示されます。git svn clone
コマンドを実行すると、SVNブランチはリモートブランチとしてインポートされ、SVNタグはtags/
というプレフィックスが付いたリモートブランチとしてインポートされます。
この動作により、一部の双方向同期の手順が簡易化されますが、一方向のマイグレーションGitを試みる場合は混乱が生じる場合があります。このため、次にこれらのリモートブランチをローカルブランチと実際のGitタグに変換する作業が必要となります。
新しいGitリポジトリのクリーンアップ
svn-migration-scripts.jar内にある
clean-gitスクリプトを
使用して、SVNブランチをローカルのGitブランチに、 SVN タグを完全なGitタグに変換します。この処理は「不可逆的」であり、GitリポジトリからSVNリポジトリにコミットを戻すことはできなくなることに留意してください。
このマイグレーションガイドの通りに作業しているのであれば、同期はSVNからGitへの一方向であり (マイグレーションステップの完了まではGitリポジトリはリードオンリーで使用します)、これが問題になることはありません。ただし、マイグレーション処理中にGitリポジトリにコミットを行なう予定があり、かつSVNリポジトリに反映させる必要がある場合は、下に示すコマンドを実行してはなりません。この操作は上級者向けであり、通常のプロジェクトにおいてはその使用を推奨しません。
クリーンアップスクリプトの処理内容を確認するには、~/GitMigration/
において次のコマンドを実行します:
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 リポジトリに同期させる方法について学習します。このプロセスは「変換」の場合と似ていますが、移行期間中においてはワークフロー上の重要な問題を考慮する必要があります。
この記事を共有する
次のトピック
おすすめコンテンツ
次のリソースをブックマークして、DevOps チームのタイプに関する詳細や、アトラシアンの DevOps についての継続的な更新をご覧ください。