ITに関するさまざまなトピックを紹介するサイトです
このコンテンツはお使いのブラウザには対応しておりません。
新しいバージョンのブラウザでアクセスしてください。

SubGitでSVNリポジトリをGitへ変換する

最近参画するほとんどのプロジェクトでは、バージョン管理にGitを利用していましたが、個人事業のローカル環境ではまだSVNを利用しているという状況でした。(2018年)
複雑な運用をするわけでもなく、特に必要性も感じなかったのでSVNのままだったのですが、SVNサーバが稼働するマシンを新しくすることになったため、これを機にGitへ移行することにしました。
そして、SVNサーバはローカルのWindowsマシンで稼働させていたのですが、Gitはクラウドサービスを利用することにしました。
GitのクラウドサービスにはBitbucketを選びました。 5ユーザまでなら、無料で非公開のリポジトリを利用できるという点が決め手でした。
SVNリポジトリをGitリポジトリに変換する方法を調べてみましたが、2つの方法が見つかりました。
  • gitのsvnサブコマンドを利用する
  • SubGitというツールを利用する
SubGitは、「変換時に情報を失わない」「処理時間が速い」というメリットを謳っていたため、こちらを利用してみることにしました。
変換処理は問題なく実行でき、無事Gitに移行することができました。
ここでは、SubGitでSVNリポジトリをGitリポジトリに変換する作業について説明します。
プロダクト バージョン
Windows7 Professional 64bit
JRE Version 8 Update 181
SubGit 3.3.3

SubGitについて

機能概要

SubGitは、TMate Software社が提供する、SVNからGitへの移行ツールです。
SVNリポジトリとGitリポジトリを同期する機能があり、移行期間を設けて、SVNとGitを並行運用するることが可能です。
今回はその必要はなかったので、SVNの運用を止めて、SVNリポジトリをGitリポジトリに変換し、すぐにGitのみで運用を開始する手順としました。
1回の変換処理でSubGitを使うやり方であれば、無料で利用できます。

インストール

リポジトリの変換処理にはsubgitコマンドのimportサブコマンドを使用しますが、Javaの実行環境が必要です。
Javaがインストールされていない場合はJREをインストールし、環境変数「JAVA_HOME」を設定しておいてください。
今回、コマンドをbatファイルに記述して実行することにしたため、先頭に以下のような設定を入れました。
set JAVA_HOME=C:\Program Files\Java\jre1.8.0_181
SubGitは以下のサイトからダウンロードします。
TMate SubGit TMate SubGit: Download
ZIPファイルをダウンロードしたら、適当なフォルダに解凍しておきます。

subgitのimportサブコマンドオプション

subgitコマンドのimportサブコマンドには多くのオプションがあり、これらを適切に指定する必要があります。
オプション 必須 指定内容
--svn-url SVNリポジトリのURLを指定する。
{REPOS_PATH} 出力するgitリポジトリのローカルフォルダパスを指定する。
--default-domain authorsファイルにルールがない場合に、SVNコミッター名からgitコミッター名を生成するためのドメインを指定する。
--minimal-revision SVNリポジトリの変換対象の最小リビジョンを指定する。
--authors-file SVNコミッターとgitコミッターのマッピングファイルのパスを指定する。
--trunk SVNのtrunkディレクトリのパスを指定する。
--branches SVNのbranchesディレクトリのパスを指定する。
--tags SVNのtagsディレクトリのパスを指定する。
--username SVNリポジトリにアクセスするユーザ名を指定する。
--password SVNリポジトリにアクセスするユーザのパスワードを指定する。
--non-interactive プロンプトを抑止する。(引数指定なし)
--trust-server-cert 未知のSSLサーバ証明書を受け入れる。(引数指定なし)
--private-key SSHアクセスに秘密鍵を使用している場合の鍵ファイルのパスを指定する。
--private-key-passphrase SSHアクセスに秘密鍵を使用している場合の鍵ファイルのパスフレーズを指定する。
いくつかのオプションには短縮形もありますが、ここでは記述を割愛します。
SubGit設定ファイルを作成してオプションを指定し、コマンドを実行するというやり方もあります。

変換作業

SVNの設定状態によって指定すべきオプションは変わってきますが、実際に変換処理を実行した際の例を説明します。
SVNサーバは、以下のように使用していました。
  • ユーザ名/パスワードによる認証を設定し、HTTPSで接続
  • 自前のSSL証明書を使用
  • リポジトリのレイアウトは標準構成
各オプションの指定は、以下のようになります。
  • リポジトリ全体を変換対象とするので、最小リビジョンは指定しない。
  • コミッターのマッピングファイルを作成して指定する。
  • リポジトリのレイアウトが標準構成なので、trunk、branches、tagsのパスは指定しない。
  • コマンドからSVNサーバへの接続に必要なので、ユーザ名とパスワードを指定する。
  • 未知のSSLサーバ証明書を受け入れる指定を追加する。
  • プロンプトを抑止する指定を追加する。(未知のSSLサーバ証明書受け入れオプション指定の際に必要)
具体的には、まず、SVNコミッターとgitコミッターのマッピングを定義したファイル「authors.txt」を作成しました。
ファイルの内容は、以下のようになります。
{SVNコミッター名} = {gitコミッター名} <{gitコミッターのメールアドレス}>
{SVNコミッター名}」、「{gitコミッター名}」、「{gitコミッターのメールアドレス}」の部分は、適宜指定してください。
先述したとおり、コマンドをbatファイルに記述して実行することにしましたが、そのファイルを次のように作成しました。
set JAVA_HOME=C:\Program Files\Java\jre1.8.0_181

{SubGit展開フォルダ}\subgit-3.3.3\bin\subgit import
		--authors-file {authors.txtファイルのパス}\authors.txt
		--username {SVNリポジトリにアクセスするユーザ名}
		--password {SVNリポジトリにアクセスするユーザのパスワード}
		--non-interactive
		--trust-server-cert
		--svn-url {SVNリポジトリのURL}
		{出力するgitリポジトリのローカルフォルダパス}
	> {ログファイルのパス}
指定したオプションが分かりやすいように、改行して記載しています。
{}」で囲まれた部分は、適宜指定してください。
コマンド実行結果の出力をログファイルにリダイレクトするようにしています。
コマンド実行結果は、以下のようになりました。
SubGit version 3.3.3 ('Bobique') build #3877

Translating Subversion revisions to Git commits...
	r1 => b{....}9  |  0%  [          ]
	r5 => 4{....}e  |  0%  [          ]
	r6 => d{....}a  |  0%  [          ]

	{中略}

	r2555 => 5{....}c  |  99%  [||||||||| ]
	r2556 => 7{....}f  |  99%  [||||||||| ]
	r2557 => f{....}7  |  100%  [||||||||||]
	Subversion revisions translated: 2557.
	Total time: 2508 seconds.

IMPORT SUCCESSFUL
途中省略しています。ID部分も先頭と末尾の1桁以外を省略していて、実際は40桁です。
変換対象となったSVNリポジトリは、タグ付けは多数ありましたが、ブランチやマージが存在しない単純なものでした。
全体で2557リビジョンあり、変換処理に2508秒掛かりました。(約42分)

結果確認

変換されたGitリポジトリはベアリポジトリでした。
該当ディレクトリに移動して、gitコマンドで確認。
$ git config core.bare
true
インストール手順は省略しますが、Gitは別途インストールする必要があります。
リモートリポジトリにBitbucketの空のリポジトリを設定して、pushしました。
$ git remote add origin {BitbucketのリポジトリのURL}

$ git push origin master
Enumerating objects: 24893, done.
Counting objects: 100% (24893/24893), done.
{中略}
* [new branch] master -> master
Bitbucketのリモートリポジトリは作成済み、接続のための認証設定も済んでいるものとします。
ブラウザからBitbucketサイトにアクセスして、リポジトリの内容を確認してみました。
コミットコメントなど、問題なくリポジトリを変換できていました。
また、バージョン管理対象外を指定するSVNの「svn:ignore」プロパティですが、この設定をもとにSubGitが「.gitignore」ファイルを自動的に生成してくれていました。

当サイトでは、第三者配信による広告サービスを利用しています。 このような広告配信事業者は、ユーザーの興味に応じた商品やサービスの広告を表示するため、当サイトや他サイトへのアクセスに関する情報(氏名、住所、メール アドレス、電話番号は含まれません)を使用することがあります。 このプロセスの詳細やこのような情報が広告配信事業者に使用されないようにする方法については、こちらをクリックしてください。