SVN から GitLab への移行

Subversion(SVN) は中央バージョン管理システム(VCS) であるのに対して、git は分散バージョン管理システムです。両者にはいくつかの大きな違いがあります。詳細については、お気に入りの検索エンジンを参照してください。

概要

SVN から git への移行には二つのアプローチがあります:

  1. Git/SVNミラー
    • GitLab リポジトリが SVN プロジェクトをミラーするようにします。
    • gitリポジトリとSVNリポジトリは同期しているので、どちらを使ってもかまいません。
    • 移行プロセスをスムーズにし、移行リスクを管理します。
  2. マイグレーションをカット
    • 既存のデータと履歴をSVNからgitに翻訳し、インポートします。
    • 小規模なチームには適しています。

SubGit を使った Git/SVN ミラーによるスムーズな移行

SubGitは、スムーズでストレスのないSVNからGitへの移行を実現するツールです。 ローカルまたはリモートのSubversionリポジトリの書き込み可能なGitミラーを作成し、好きなだけSubversionとGitの両方を使うことができます。 Gitリポジトリとファイルシステムレベルで直接やり取りするため、GitLabサーバーへのアクセスが必要です。

SubGit の前提条件

  1. Oracle JRE 1.8以降をインストールしてください。 DebianベースのLinuxディストリビューションでは、この記事に従ってください。
  2. https://subgit.com/downloadから SubGit をダウンロードしてください。
  3. ダウンロードした SubGit zip アーカイブを/opt ディレクトリに解凍してください。subgitコマンドは/opt/subgit-VERSION/bin/subgitで使用できるようになります。

SubGit の設定

GitLab で SVN リポジトリをミラーする最初のステップは、ミラーとして使用する新しい空のプロジェクトを作成することです。 Omnibus のインストールでは、リポジトリへのパスはデフォルトで/var/opt/gitlab/git-data/repositories/USER/REPO.git になります。ソースからのインストールでは、デフォルトのリポジトリディレクトリは/home/git/repositories/USER/REPO.gitになります。便宜上、このパスを変数に割り当てます:

GIT_REPO_PATH=/var/opt/gitlab/git-data/repositories/USER/REPOS.git

SubGit はこのリポジトリをリモートの SVN プロジェクトと同期させておきます。 便宜上、リモートの SVN プロジェクトの URL を変数に代入しておきましょう:

SVN_PROJECT_URL=http://svn.company.com/repos/project

次に、Git/SVN ミラーをセットアップするために SubGit を実行する必要があります。以下のsubgit コマンドが GitLab Git リポジトリの所有権を保持する同じユーザー(デフォルトではgit)で実行されていることを確認してください:

subgit configure --layout auto $SVN_PROJECT_URL $GIT_REPO_PATH

必要に応じて、作成者とブランチのマッピングを調整してください。 お好きなテキストエディタで開いてください:

edit $GIT_REPO_PATH/subgit/authors.txt
edit $GIT_REPO_PATH/subgit/config

SubGit の設定オプションの詳細については、SubGit のドキュメントウェブサイトを参照してください。

初翻訳

これで SubGit が Git/SVN リポジトリを設定したので、subgit を実行して既存の SVN リビジョンを Git リポジトリに初期変換します:

subgit install $GIT_REPO_PATH

最初の翻訳が完了すると、Git リポジトリと SVN プロジェクトはsubgit によって同期が保たれます。Git の新しいコミットは SVN のリビジョンに翻訳され、SVN の新しいリビジョンは Git のコミットに翻訳されます。Mirror は透過的に動作し、特別なコマンドは必要ありません。

subgitで1回限りのカットオーバー・マイグレーションを行いたい場合は、installの代わりにimport コマンドを使用します:

subgit import $GIT_REPO_PATH

SubGit ライセンス

SubGit をミラーモードで実行するには登録が必要です。 オープンソース、アカデミック、スタートアップのプロジェクトでは登録は無料です。

SubGitのサポート

SubGit による SVN からGitLabへの移行に関するご質問は、SubGit チームsupport@subgit.comまで直接お問い合わせください。

svn2git によるマイグレーションのカットオーバー

現在SVNリポジトリを使っている場合、そのリポジトリをGitとGitLabに移行することができます。 私たちはハードカットオーバーを推奨します - 移行コマンドを一度実行し、すべての開発者が新しいGitLabリポジトリをすぐに使い始めるようにします。 そうしないと、双方向で変更を同期し続けることが難しくなります。 変換プロセスは、ローカルのワークステーションで実行する必要があります。

svn2gitをインストールします。すでにRubyとGitがインストールされていれば、どのシステムでもRuby gemとしてインストールできます。

sudo gem install svn2git

DebianベースのLinuxディストリビューションでは、ネイティブパッケージをインストールできます:

sudo apt-get install git-core git-svn ruby

オプションで、svn2git で SVN の作成者を Git の作成者にマッピングできるように、作成者ファイルを用意します。作成者ファイルを作成しないことにすると、コミットが正しい GitLab ユーザーに帰属しなくなります。これを大きなイシューと考えないユーザーもいれば、このステップを確実に完了させたいユーザーもいるでしょう。 作成者をマッピングすることにすると、SVN リポジトリの変更に存在するすべての作成者をマッピングする必要があります。そうしないと、変換に失敗して作成者ファイルを更新しなければならなくなります。次のコマンドは、リポジトリ内を検索して作成者の一覧を出力します。

svn log --quiet | grep -E "r[0-9]+ \| .+ \|" | cut -d'|' -f2 | sed 's/ //g' | sort | uniq

最後のコマンドの出力を使用して、作成者ファイルを作成します。authors.txt というファイルを作成し、1行に1つのマッピングを追加します。

janedoe = Jane Doe <janedoe@example.com>
johndoe = John Doe <johndoe@example.com>

SVN リポジトリが標準形式(トランク、ブランチ、タグ、ネストなし)であれば、変換は簡単です。 標準以外のリポジトリについては、svn2git のドキュメントを参照してください。 次のコマンドは、リポジトリをチェックアウトし、現在の作業ディレクトリで変換を行います。svn2git コマンドを実行する前に、必ずリポジトリごとに新しいディレクトリを作成してください。変換処理には時間がかかります。

svn2git https://svn.example.com/path/to/repo --authors /path/to/authors.txt

SVN リポジトリにユーザー名とパスワードが必要な場合は、上記のコマンドに--username <username>--password <password> フラグを追加します。svn2git は、特定のファイルパスやブランチ、タグなどを除外することもサポートしています。使用可能なすべてのオプションに関する完全なドキュメントについては、svn2git のドキュメントを参照するか、svn2git --help を実行してください。

新しいGitLabプロジェクトを作成し、最終的に変換したコードをプッシュします。 SSHまたはHTTP(S) リポジトリのURLをプロジェクトページからコピーします。 GitLabリポジトリをGitリモートとして追加し、すべての変更をプッシュします。 これにより、すべてのコミット、ブランチ、タグがプッシュされます。

git remote add origin git@gitlab.com:<group>/<project>.git
git push --all origin
git push --tags origin

このガイドに貢献する

SVNや他のバージョン管理システムからの移行方法について、このガイドを拡張するような貢献を歓迎します。