バージョン管理システムの主流は、SubversionからGitに移っていると言えると思います。
今回、CentOS 6で動く巨大Subversionリポジトリを、分割してCentOS 7のGitに移行したので手順をまとめました。
目次
Subversion から Git へリポジトリを分割して移行
この度、以下のような
巨大なSubversionのリポジトリ (CentOS 6で動作) を
3分割してGit (CentOS 7で動作)
に移行する機会があったので作業手順をご紹介します。
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に所属させるには以下のコマンドを実行します。
1 2 3 |
# groupadd gitgrp # cd /home # ls | xargs -i -t usermod -G gitgrp {} |
git-svnを使って、SubversionからGitに移行する
Gitには、履歴ごとSubversionからGitに移行できる
git-svn
という便利なパッケージが存在します。
ワーク用のディレクトリ original を作成します。
1 2 |
# mkdir original # cd /root/original |
SubversionからGitに移行します。
ここで、
(Subversionサーバー)/var/www/svn/S
に移行したいSubversionのリポジトリが存在するとします。
Sには、ディレクトリA、B、C、D、E、Fが存在するとします。
以下のコマンドで、SubversionからGitへ履歴ごとtrunk、branchesを移行することが出来ます。
1 |
# 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 については以下をご覧ください。
git filter-branch --subdirectory-filter
という便利なコマンドがあるのですが、これは、1つのディレクトリの抽出にしか対応できません。
ここでは、Gitリポジトリから複数のディレクトリを抽出する方法をご紹介します。
Git cloneを作成します。
1 2 3 |
# mkdir /root/new1 # cd /root/new1 # git clone /root/original/S/.git |
以上で、
/root/new1/S/.git
が作成されます。
1 2 |
# 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
というエラーメッセージが表示されますが、無視してもよいです。
1 |
# mv .git G1 |
以上で、
/root/new1/S/G1
というGitのリポジトリが作成されました。
G1には、ディレクトリA、Bのみが存在します。
同様に以下の手順を実行します。
1 2 3 |
# mkdir /root/new2 # cd /root/new2 # git clone /root/original/S/.git |
以上で、
/root/new2/S/.git
が作成されます。
1 2 3 |
# 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のみが存在します。
1 2 3 |
# mkdir /root/new3 # cd /root/new3 # git clone /root/original/S/.git |
以上で、
/root/new3/S/.git
が作成されます。
1 2 3 |
# 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
に配置します。
1 2 3 4 5 |
# 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のみの例を示します。
ディスクリプションを記述します。
1 |
# vim description |
ガーベッジコレクションを行います。
1 2 |
# cd G1 # git gc |
リポジトリの圧縮方法を-1に変えます。
-1はzlibによる圧縮です。
0は無圧縮です。
1から9まで設定することが可能ですが、スピードとサイズとのトレードオフになります。
1が最も速く、9が最も遅くなります。
1 |
# git config --add core.compression -1 |
リポジトリをbareにします。
bareにしないとpushが拒否されます。
1 |
# git config --bool core.bare true |
リポジトリをグループで共有する設定にします。
1 |
# git config core.sharedRepository group |
Gitリポジトリのファイルシステムの権限変更
Gitリポジトリのファイルシステムの権限を変更しておきます。
これで、gitgrpに属するユーザーは読み込み書き込みを行うことが可能となります。
1 2 3 4 5 |
# 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 {} \; |
以上で、リポジトリの移行が完了しました。
Gitについてのおすすめの本
↓Gitについてのおすすめの本はコチラ
コメント
[…] […]