はじめに
バージョン管理ソフトウェアの役割や集中型、分散型の利用方法を解説しました。
今回は、CVS のリポジトリを別のリポジトリ(SVN, Git, Mercurial)に移行する方法を説明します。
- CVS から SVN リポジトリに変換する方法
- CVS から Git リポジトリに変換する方法
- CVS から Mercurial リポジトリに変換する方法
なお、構築に使用したマシン環境は、下記のとおりです。環境が異なっても移行する方法は同じですので CVS から SVN, Git, Mercurial リポジトリに変換することが出来ます。
項目 | 内容 |
---|---|
OS | Windows 7 Ultimate 32bit |
IPアドレス | 192.168.0.253 |
Cygwin | Setup Version 2.831 |
VirtualBox | 4.3.4 r91027 |
Vagrant | 1.3.5 |
上記のソフトウェアと環境を使って解説を進めていきますが異なる環境でも同様の操作は可能です。また以下の記事を参考にして仮想環境の構築を解説していますので参考にしてください。
リポジトリ変換方法
これまでに解説したバージョン管理ソフトウエアごとのリポジトリ変換方法を纏めると、下記のようになります。
移行先リポジトリ | ||||
---|---|---|---|---|
移行元リポジトリ | CVS | SVN | Git | Hg |
CVS | n/a | cvs2svn 一括変換 低 |
cvs2git 一括変換 低 |
hg convert 逐次変換 高 |
SVN | manual 手動変換 無 |
n/a | git-svn 一括変換 中 |
hg convert 逐次変換 低 |
Git | manual 手動変換 無 |
manual 手動変換 無 |
n/a | hg convert 逐次変換 低 |
Hg | manual 手動変換 無 |
manual 手動変換 無 |
manual 手動変換 無 |
n/a |
表中の各項目は、上から順に使用するコマンド、変換方法、難易度を表しています。
内容 | 説明 | |
---|---|---|
コマンド | cvs2svn | CVS→SVNリポジトリ変換コマンド |
cvs2git | CVS→Gitリポジトリ変換コマンド | |
git-svn | SVN→Gitリポジトリ変換コマンド | |
hg convert | Mercurial拡張コマンド | |
manual | 移行元、移行先のバージョン管理ソフトウエアのcheckout/importコマンド | |
変換方法 | 一括変換 | 移行元のリポジトリを全て一括変換できる。 |
逐次変換 | 移行元のリポジトリを個別に変換できる。 | |
手動変換 | 移行元のリポジトリをチェックアウトして、移行先にインポートする。 | |
難易度 | 低 | 簡単に変換できる。 |
中 | 少し手間が掛かるが、変換できる。 | |
高 | 変換が不安定なことが多い。 |
リポジトリ変換方法の概要が分かりましたので、実際にリポジトリを変換します。
リポジトリの作成
リポジトリの移行に先立ち、CVSおよび、SVNリポジトリを新規に作成します。Gitおよび、Mercurialリポジトリは、過去の記事で作成したリポジトリを引き続き使用します。
BOX起動
過去の記事で使用したBOXを起動し、接続します。
$ cd /tmp/unix
$ vagrant up
$ vagrant ssh
CVSリポジトリの作成
CVSリポジトリを作成し、モジュールをインポートした後にファイルを追加します。
リポジトリ作成
$ export CVSROOT=~vagrant/cvsrepo
$ cvs init
モジュールのインポート
$ mkdir -p /tmp/cvs && cd /tmp/cvs
$ echo cvs1 > cvs1.c
$ echo cvs2 > cvs2.c
$ cvs import -m 'CVS IMPORT' cvstest mycvsrepo start
モジュールのチェックアウト
$ rm *.c
$ cvs co cvstest
SVNリポジトリの作成
SVNリポジトリを作成し、モジュールをインポートした後にファイルを追加します。
リポジトリ作成
$ svnadmin create /home/vagrant/svnrepo
$ svn mkdir --parents file:///home/vagrant/svnrepo/project/trunk -m'CREATE TRUNK'
$ svn mkdir --parents file:///home/vagrant/svnrepo/project/branches -m'CREATE BRANCHES'
$ svn mkdir --parents file:///home/vagrant/svnrepo/project/tags -m'CREATE TAGS'
リポジトリ表示
$ svn list file:///home/vagrant/svnrepo
$ svn list file:///home/vagrant/svnrepo/project
モジュールのインポート
$ mkdir -p /tmp/svn && cd /tmp/svn
$ echo svn1 > svn1.c
$ echo svn2 > svn2.c
$ svn import . file:///home/vagrant/svnrepo/project/trunk -m 'SVN IMPORT'
モジュールのチェックアウト
$ rm *.c
$ svn co file:///home/vagrant/svnrepo/project/trunk
以上で、CVSおよび、SVNリポジトリの作成が終了しましたので、リポジトリの移行方法を解説します。
CVSからSVNリポジトリに移行する
CVSリポジトリをSVNリポジトリに変換するには、cvs2svn コマンドを使用します。
サイト名はcvs2svnになっていますが、ダウンロードしたパッケージには、SVNの他にもGitやMercurialリポジトリへの変換プログラムも含まれています。
今回は、先程作成したSVNリポジトリを既存のリポジトリと見なし、既存のSVNリポジトリに変換したCVSリポジトリを追加します。
変換プログラムのダウンロード
公式サイトから変換プログラムをダウンロードします。
$ mkdir -p /tmp/work && cd /tmp/work
$ svn co --username=guest --password="" http://cvs2svn.tigris.org/svn/cvs2svn/trunk cvs2svn-trunk
Store password unencrypted (yes/no)が表示されたら、yesを入力します。
リポジトリの変換
CVSリポジトリをSVNリポジトリに変換します。
なお、cvs2svnコマンドを実行すると、指定したSVNリポジトリの直下に trunk/branches/tags フォルダが作成されて変換されますので、既存リポジトリが異なるリポジトリ階層になっている場合には、既存リポジトリのフォルダ移動を検討すると良いでしょう。既存リポジトリの移動は必ずしも必要ありませんが、管理のしやすさを考慮し、今回は移動しています。
$ cd cvs2svn-trunk
$ ./cvs2svn --existing-svnrepos --encoding=utf-8 -s ~/svnrepo ~/cvsrepo
リポジトリ表示
$ svn list file:///home/vagrant/svnrepo
$ svn list file:///home/vagrant/svnrepo/trunk
$ svn list file:///home/vagrant/svnrepo/trunk/cvstest
CVSROOTモジュールの削除
変換したCVSリポジトリに含まれる、CVSROOTモジュールを削除します。
$ svn remove file:///home/vagrant/svnrepo/trunk/CVSROOT -m'DELETE CVSROOT'
$ svn list file:///home/vagrant/svnrepo/trunk
既存モジュールの移動
SVNリポジトリの既存モジュールを移動します。
$ svn move file:///home/vagrant/svnrepo/project/trunk file:///home/vagrant/svnrepo/trunk/project -m 'MOVE PROJECT TRUNK'
$ svn move file:///home/vagrant/svnrepo/project/branches file:///home/vagrant/svnrepo/branches/project -m 'MOVE PROJECT BRANCH'
$ svn move file:///home/vagrant/svnrepo/project/tags file:///home/vagrant/svnrepo/tags/project -m 'MOVE PROJECT BRANCH'
既存モジュールの削除
移動元のモジュールには、フォルダが無くなったため、移動元のモジュールを削除します。
$ svn list file:///home/vagrant/svnrepo/project
$ svn delete file:///home/vagrant/svnrepo/project -m 'DELETE EMPTY MODULE'
リポジトリ表示
既存モジュール移動後のリポジトリを表示します。
$ svn list file:///home/vagrant/svnrepo/trunk
$ svn list file:///home/vagrant/svnrepo/trunk/cvstest
$ svn list file:///home/vagrant/svnrepo/trunk/project
モジュールのチェックアウト
SVNリポジトリのモジュールを、それぞれチェックアウトします。
$ cd /tmp/svn
$ svn co file:///home/vagrant/svnrepo/trunk/cvstest
$ svn co file:///home/vagrant/svnrepo/trunk/project
以上で、CVSリポジトリをSVNリポジトリに移行できます。
CVSからGitリポジトリに移行する
CVSリポジトリをGitリポジトリに変換するには、cvs2gitコマンドを使用します。
CVSリポジトリのダンプ
CVSリポジトリをGitリポジトリに変換するために、CVSリポジトリをcvs2gitコマンドを使用してダンプします。
$ mkdir -p /tmp/cvs2git
$ cd /tmp/work/cvs2svn_trunk
$ ./cvs2git --encoding=utf-8 --blobfile=/tmp/cvs2git/git-blob.dat --dumpfile=/tmp/cvs2git/git-dump.dat --username vagrant ~/cvsrepo
移行先のGitリポジトリの作成
CVSリポジトリの移行先となるGitリポジトリを作成します。
gitユーザーでGitサーバーに接続し、cvs2git.gitベアリポジトリを作成します。
また、ssh-agentを起動し、SSH接続時のパスフレーズ入力をバイパスします。
$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa
$ ssh git@gitserver
$ mkdir ~/cvs2git.git && cd ~/cvs2git.git
$ git init --bare
CVSリポジトリのインポート
先程作成したダンプしたデータを、Gitリポジトリにインポートします。
$ cat /tmp/cvs2git/git-blob.dat /tmp/cvs2git/git-dump.dat | git fast-import
リモートリポジトリの設定
作成したGitリポジトリを、リモートリポジトリとして設定し、設定内容を確認します。
確認が終了したら、gitユーザーからログアウトします。
$ git remote add origin git@gitserver:cvs2git.git
$ git remote -v
$ exit
マスターリポジトリのクローン
作成したGitリポジトリをローカルにクローンします。
$ mkdir -p /tmp/git && cd /tmp/git
$ git clone git@gitserver:cvs2git.git
ローカルリポジトリの更新
リモートリポジトリから取得したローカルリポジトリから、CVSROOTモジュールを削除しマスターリポジトリに送信します。
$ cd cvs2git
$ git rm -r CVSROOT
$ git commit -m 'DELETE CVSROOT'
$ git push origin master
以上で、CVSリポジトリをGitリポジトリに移行できます。
CVSからMercurialリポジトリに移行する
CVSリポジトリをMercurialリポジトリに変換するには、Mercurialの拡張コマンドconvertを使用します。
これまでのように、一括変換ができませんので、移行するCVSリポジトリごとに変換する必要があります。
CVSリポジトリのアクセス権変更
hgユーザーでCVSリポジトリにアクセスするため、CVSリポジトリのアクセス権を変更します。
なお、本処理は先に作成したCVSリポジトリに対してhgユーザーの書込権限が無いために行っています。
Otherユーザーに書込権限が設定されているCVSリポジトリの場合は、アクセス権を再設定する必要はありません。
$ chmod 0777 ~/cvsrepo/CVSROOT ~/cvsrepo/cvstest
cvspsプログラムのインストール
convertコマンドで使用する cvsps コマンドをビルドし、インストールします。
$ cd /tmp/work
$ wget -q http://www.cobite.com/cvsps/cvsps-2.1.tar.gz
$ tar zxf cvsps-2.1.tar.gz && rm -f cvsps-2.1.tar.gz
$ cd cvsps-2.1 && make
$ sudo make install clean
CVSリポジトリのチェックアウト
hgユーザーでMercurialサーバーに接続し、移行するCVSリポジトリをチェックアウトします。
$ ssh hg@hgserver
$ mkdir ~/tmp && cd ~/tmp
$ cvs -d ~vagrant/cvsrepo co cvstest
リポジトリの変換
CVSリポジトリをMercurialリポジトリに変換します。
Mercurial拡張コマンドが利用できるように、~/.hgrcを下記のとおり編集します。
[convert]
cvsps = cvsps -A -u --cvs-direct -q
[extensions]
hgext.convert =
修正が終了したら、リポジトリを変換しログアウトします。
$ hg convert cvstest ~/cvs2hg.hg
$ exit
リモートリポジトリのクローン
作成したMercurialリポジトリをクローンします。
$ mkdir -p /tmp/hg && cd /tmp/hg
$ hg clone ssh://hg@hgserver/cvs2hg.hg
以上で、CVSリポジトリをMercurialリポジトリに移行できます。
ノート
なお、本記事で使用しているhgコマンドのバージョンは、1.4で、公式ドキュメント では、cvsps を必要としないとなっていますが、cvsps を使う設定を ~/.hg に設定しないと変換が失敗することがあったため、今回は設定して変換しています。
また、変換も成功したり、失敗したりと動作が不安定になりがちですので、CVS→Mercurialに変換する場合、CVS -> Git -> Mercurialという順で一括変換することをお勧めします。
まとめ
ここまで、CVSリポジトリをSVN/Git/Mercurialリポジトリに移行する方法を解説しました。次回は、今回取り上げなかったその他のリポジトリの移行方法について解説します。
社内サーバにリモートリポジトリを作るのも一つですが、「開発にまつわる面倒事」をこの際全部、tracpath(トラックパス)に任せてみませんか?
バージョン管理サービス・プロジェクト管理サービスの「tracpath(トラックパス)」では、
ユーザー5名、リポジトリ数3つまで、無料で利用可能です。
さっそく実務でも使って見ましょう。
自らも開発を行う会社が作ったからこそ、開発チームの「作る情熱」を支える、やるべきことに集中出来るサービスになっています。
エンタープライズ利用が前提のASPサービスなので、セキュリティも強固です。