巨大Subversionリポジトリを分割してGitに移行

シェアする

  • このエントリーをはてなブックマークに追加

バージョン管理システムの主流は、SubversionからGitに移っていると言えると思います。
この度、以下のような巨大なSubversionのリポジトリを3分割してGitに移行する機会があったので作業手順をご紹介します。WS000314

スポンサードリンク

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

Subversionサーバーで使っていたユーザーとパスワードについては、Gitサーバーでもそのまま使いたいので移行します。
以下のSubversionのディレクトリをGitサーバーにコピーします。
/home
/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow

Linuxにおいて、CentOS 6からCentOS 7へのユーザー移行方法は次の通り、/homeをについては実体をコピーし、/etc/passwdなどのファイルについては該当のユーザー、パスワードのみをコピー&ペーストで問題ありません。

もともと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に所属させるには以下のコマンドを実行します。

# groupadd gitgrp
# cd /home
# ls | xargs -i -t usermod -G gitgrp {}

スポンサードリンク

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

Gitには、履歴ごとSubversionからGitに移行できるgit-svnという便利なパッケージが存在します。

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

# mkdir original
# cd /root/original

SubversionからGitに移行します。
ここで、(Subversionサーバー)/var/www/svn/S に移行したいSubversionのリポジトリが存在するとします。
Sには、ディレクトリA、B、C、D、E、Fが存在するとします。
以下のコマンドで、SubversionからGitへ履歴ごとtrunk、branchesを移行することが出来ます。

# git svn clone --trunk= --branches=branches --prefix=svn/ svn+ssh://(ユーザー名)@(Subverionサーバー)/var/www/svn/S

以上で、Subversionから移行したGitリポジトリ /root/original/S/.git が作成されました。

スポンサードリンク

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

Gitリポジトリを3分割します。
リポジトリの分割には、git filter-branchというコマンドを使います。
git filter-branch --subdirectory-filter という便利なコマンドがあるのですが、これは、1つのディレクトリの抽出にしか対応できません。
ここでは、Gitリポジトリから複数のディレクトリを抽出する方法をご紹介します。

Git cloneを作成します。
# mkdir /root/new1
# cd /root/new1
# git clone /root/original/S/.git
以上で、/root/new1/S/.git が作成されます。

# cd /root/new1/S
# git filter-branch -f --prune-empty --index-filter 'git rm --cached -r -q -- . ; git reset -q $GIT_COMMIT -- A B' -- --all
git rmでリポジトリにマッチするファイルがなければ、fatal: pathspec ‘’ did not match any filesでいうエラーメッセージが表示されますが、無視してもよいです。

# mv .git G1
以上で、/root/new1/S/G1 というGitのリポジトリが作成されました。G1には、ディレクトリA、Bのみが存在します。

同様に以下の手順を実行します。
# mkdir /root/new2
# cd /root/new2
# git clone /root/original/S/.git

以上で、/root/new2/S/.git が作成されます。

# cd /root/new2/S
# git filter-branch -f --prune-empty --index-filter 'git rm --cached -r -q -- . ; git reset -q $GIT_COMMIT -- C D' -- --all
# mv .git G2
以上で、/root/new2/S/G2 というGitのリポジトリが作成されました。G2には、ディレクトリC、Dのみが存在します。

# mkdir /root/new3
# cd /root/new3
# git clone /root/original/S/.git

以上で、/root/new3/S/.git が作成されます。

# cd /root/new3/S
# git filter-branch -f --prune-empty --index-filter 'git rm --cached -r -q -- . ; git reset -q $GIT_COMMIT -- E F' -- --all
# mv .git G3
以上で、/root/new2/S/G3 というGitのリポジトリが作成されました。G3には、ディレクトリE、Fのみが存在します。

Gitリポジトリの配置

Gitのリポジトリを /var/lib/gitに配置します。
# mkdir /var/lib/git
# cd /var/lib/git
# mv /root/new1/S/G1 .
# mv /root/new2/S/G2 .
# mv /root/new3/S/G3 .

以下のコマンドは、リポジトリG1、G2、G3すべてについて行いますが、ここではG1のみの例を示します。

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

ガーベッジコレクションを行います。
# cd G1
# git gc

リポジトリの圧縮方法を-1に変えます。
-1はzlibによる圧縮です。
0は無圧縮です。
1から9まで設定することが可能ですが、スピードとサイズとのトレードオフになります。
1が最も速く、9が最も遅くなります。
# git config --add core.compression -1

リポジトリをbareにします。
bareにしないとpushが拒否されます。
# git config --bool core.bare true

リポジトリをグループで共有する設定にします。
# git config core.sharedRepository group

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

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

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

# cd /var/lib/git
# chown -R root:gitgrp /var/lib/git
# chmod 2775 /var/lib/git
# find . -type f -exec chmod 0664 {} \;
# find . -type d -exec chmod 2775 {} \;

お役に立ちましたら、シェアをお願いします。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です