Close

Git 変換:SVN から Git への移行の一歩

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

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

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

*これらのスクリプトは、利用可能な git バージョンが 1.8.x のみであった時点で記述されたものです。そのため、このスクリプトを動作させるには、このバージョンの git を使用する必要があります。


SVNリポジトリのクローン


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

Gitマイグレーション: git svn cloneコマンド
データベース
関連資料

Git リポジトリ全体を移動する方法

Bitbucket ロゴ
ソリューションを見る

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を試みる場合は混乱が生じる場合があります。このため、次にこれらのリモートブランチをローカルブランチと実際の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 についての継続的な更新をご覧ください。

一面のツールを使ってコラボレーションしている人たち

Bitbucket ブログ

DevOps のイラスト

DevOps ラーニング パス

Demo Den アトラシアン・エキスパートによる機能デモ

Bitbucket Cloud が、Atlassian Open DevOps とどのように連携するか

DevOps ニュースレター購読

Thank you for signing up