巨大Subversionリポジトリを分割してGitに移行 git filter-branchの活用

Git

バージョン管理システムの主流は、SubversionからGitに移っていると言えると思います。

今回、CentOS 6で動く巨大Subversionリポジトリを、分割してCentOS 7のGitに移行したので手順をまとめました。

スポンサーリンク
スポンサーリンク

Subversion から Git へリポジトリを分割して移行

この度、以下のような

巨大なSubversionのリポジトリ (CentOS 6で動作) を

3分割してGit (CentOS 7で動作)

に移行する機会があったので作業手順をご紹介します。

WS000314

Linuxのユーザー、パスワードを移行

Subversionサーバーで使っていたユーザーとパスワードについては、Gitサーバーでもそのまま使いたいので移行します。

以下のSubversionのディレクトリをGitサーバーにコピーします。

/home
/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow

Linuxにおいて、CentOS 6からCentOS 7へのユーザー移行方法は次の通り、

/home

については実体をコピーし、

/etc/passwd

などのファイルについては該当のユーザー、パスワードのみをコピー&ペーストで問題ありません。

ユーザーの移行方法については、以下にまとめました。

CentOS 6のサーバーの全ユーザーを別のCentOS 7のサーバーに移行する方法
サーバーA(CentOS 6)のユーザーをサーバーB(CentOS 7)に移行する機会があったので覚え書きをまとめま...

もともとGitサーバーにあった

/home

については

/home-orig

にリネームして、Subversionサーバーから実体をコピーします。

/etc/passwd については、

vipw

を使ってGitサーバーで使うユーザーのみを

Subversionサーバーの

/etc/passwd

からコピー&ペーストします。

/etc/shadow については、

vipw -s

を使ってGitサーバーで使うユーザーのみを

Subversionサーバーの

/etc/shadow

からコピー&ペーストします。

/etc/groupについては、

vigr

を使ってGitサーバーで使うグループのみを

Subversionサーバーの

/etc/group

からコピー&ペーストします。

/etc/gshadow については、

vigr -s

を使ってGitサーバーで使うグループのみを

Subversionサーバーの

/etc/gshadow

からコピー&ペーストします。

次に、gitグループgitgrpを作成して

/home

のユーザーをgitgrpに所属させます。

/home

以下のすべてのユーザーをgitgrpに所属させるには以下のコマンドを実行します。

git-svnを使って、SubversionからGitに移行する

Gitには、履歴ごとSubversionからGitに移行できる

git-svn

という便利なパッケージが存在します。

ワーク用のディレクトリ original を作成します。

SubversionからGitに移行します。

ここで、

(Subversionサーバー)/var/www/svn/S

に移行したいSubversionのリポジトリが存在するとします。

Sには、ディレクトリA、B、C、D、E、Fが存在するとします。

以下のコマンドで、SubversionからGitへ履歴ごとtrunk、branchesを移行することが出来ます。

以上で、Subversionから移行した

Gitリポジトリ

/root/original/S/.git

が作成されました。

git filter-branchを使ってローカルのGitリポジトリを分割する

Gitリポジトリを3分割します。

リポジトリの分割には、

git filter-branch

というコマンドを使います。

git filter-branch については以下をご覧ください。

git filter-branchで歴史の書換え、リポジトリのディレクトリ構成を移動、変更、削除する方法
git filter-branchでリポジトリの歴史の書換え、ディレクトリ構成を移動、変更、削除する方法をまとめまし...

git filter-branch --subdirectory-filter

という便利なコマンドがあるのですが、これは、1つのディレクトリの抽出にしか対応できません。

ここでは、Gitリポジトリから複数のディレクトリを抽出する方法をご紹介します。

Git cloneを作成します。

以上で、

/root/new1/S/.git

が作成されます。

git rm

でリポジトリにマッチするファイルがなければ、

fatal: pathspec ‘’ did not match any files

というエラーメッセージが表示されますが、無視してもよいです。

以上で、

/root/new1/S/G1

というGitのリポジトリが作成されました。

G1には、ディレクトリA、Bのみが存在します。

同様に以下の手順を実行します。

以上で、

/root/new2/S/.git

が作成されます。

以上で、

/root/new2/S/G2

というGitのリポジトリが作成されました。

G2には、ディレクトリC、Dのみが存在します。

以上で、

/root/new3/S/.git

が作成されます。

以上で、

/root/new2/S/G3

というGitのリポジトリが作成されました。

G3には、ディレクトリE、Fのみが存在します。

Gitリポジトリの配置

Gitのリポジトリを

/var/lib/git

に配置します。

以下のコマンドは、

リポジトリG1、G2、G3すべてについて行いますが、

ここではG1のみの例を示します。

ディスクリプションを記述します。

ガーベッジコレクションを行います。

リポジトリの圧縮方法を-1に変えます。

-1はzlibによる圧縮です。

0は無圧縮です。

1から9まで設定することが可能ですが、スピードとサイズとのトレードオフになります。

1が最も速く、9が最も遅くなります。

リポジトリをbareにします。

bareにしないとpushが拒否されます。

リポジトリをグループで共有する設定にします。

Gitリポジトリのファイルシステムの権限変更

Gitリポジトリのファイルシステムの権限を変更しておきます。

これで、gitgrpに属するユーザーは読み込み書き込みを行うことが可能となります。

以上で、リポジトリの移行が完了しました。

Gitについてのおすすめの本

↓Gitについてのおすすめの本はコチラ

Git