CVS リポジトリを別のリポジトリに移行する方法

はじめに

バージョン管理ソフトウェアの役割や集中型、分散型の利用方法を解説しました。

今回は、CVS のリポジトリを別のリポジトリ(SVN, Git, Mercurial)に移行する方法を説明します。

  1. CVS から SVN リポジトリに変換する方法
  2. CVS から Git リポジトリに変換する方法
  3. CVS から Mercurial リポジトリに変換する方法

repo-ikou00.png

なお、構築に使用したマシン環境は、下記のとおりです。環境が異なっても移行する方法は同じですので 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

repo-ikou01.png

モジュールのインポート

$ mkdir -p /tmp/cvs && cd /tmp/cvs
$ echo cvs1 > cvs1.c
$ echo cvs2 > cvs2.c
$ cvs import -m 'CVS IMPORT' cvstest mycvsrepo start

repo-ikou02.png

モジュールのチェックアウト

$ rm *.c
$ cvs co cvstest

repo-ikou03.png

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'

repo-ikou05.png

リポジトリ表示

$ svn list file:///home/vagrant/svnrepo
$ svn list file:///home/vagrant/svnrepo/project

repo-ikou06.png

モジュールのインポート

$ 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'

repo-ikou07.png

モジュールのチェックアウト

$ rm *.c
$ svn co file:///home/vagrant/svnrepo/project/trunk

repo-ikou08.png

以上で、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

repo-ikou09.png

Store password unencrypted (yes/no)が表示されたら、yesを入力します。

repo-ikou10.png

リポジトリの変換

CVSリポジトリをSVNリポジトリに変換します。

なお、cvs2svnコマンドを実行すると、指定したSVNリポジトリの直下に trunk/branches/tags フォルダが作成されて変換されますので、既存リポジトリが異なるリポジトリ階層になっている場合には、既存リポジトリのフォルダ移動を検討すると良いでしょう。既存リポジトリの移動は必ずしも必要ありませんが、管理のしやすさを考慮し、今回は移動しています。

$ cd cvs2svn-trunk
$ ./cvs2svn --existing-svnrepos --encoding=utf-8 -s ~/svnrepo ~/cvsrepo

repo-ikou11.png
repo-ikou12.png

リポジトリ表示

$ svn list file:///home/vagrant/svnrepo
$ svn list file:///home/vagrant/svnrepo/trunk
$ svn list file:///home/vagrant/svnrepo/trunk/cvstest

repo-ikou13.png

CVSROOTモジュールの削除

変換したCVSリポジトリに含まれる、CVSROOTモジュールを削除します。

$ svn remove file:///home/vagrant/svnrepo/trunk/CVSROOT -m'DELETE CVSROOT'
$ svn list file:///home/vagrant/svnrepo/trunk

repo-ikou14.png
repo-ikou15.png

既存モジュールの移動

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'

repo-ikou16.png

既存モジュールの削除

移動元のモジュールには、フォルダが無くなったため、移動元のモジュールを削除します。

$ svn list file:///home/vagrant/svnrepo/project
$ svn delete file:///home/vagrant/svnrepo/project -m 'DELETE EMPTY MODULE'

repo-ikou17.png

リポジトリ表示

既存モジュール移動後のリポジトリを表示します。

$ svn list file:///home/vagrant/svnrepo/trunk
$ svn list file:///home/vagrant/svnrepo/trunk/cvstest
$ svn list file:///home/vagrant/svnrepo/trunk/project

repo-ikou18.png

モジュールのチェックアウト

SVNリポジトリのモジュールを、それぞれチェックアウトします。

$ cd /tmp/svn
$ svn co file:///home/vagrant/svnrepo/trunk/cvstest
$ svn co file:///home/vagrant/svnrepo/trunk/project

repo-ikou19.png

以上で、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

repo-ikou22.png
repo-ikou23.png

移行先のGitリポジトリの作成

CVSリポジトリの移行先となるGitリポジトリを作成します。

gitユーザーでGitサーバーに接続し、cvs2git.gitベアリポジトリを作成します。

また、ssh-agentを起動し、SSH接続時のパスフレーズ入力をバイパスします。

$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa

repo-ikou24.png

$ ssh git@gitserver
$ mkdir ~/cvs2git.git && cd ~/cvs2git.git
$ git init --bare

repo-ikou25.png

CVSリポジトリのインポート

先程作成したダンプしたデータを、Gitリポジトリにインポートします。

$ cat /tmp/cvs2git/git-blob.dat /tmp/cvs2git/git-dump.dat | git fast-import

repo-ikou26.png
repo-ikou27.png

リモートリポジトリの設定

作成したGitリポジトリを、リモートリポジトリとして設定し、設定内容を確認します。

確認が終了したら、gitユーザーからログアウトします。

$ git remote add origin git@gitserver:cvs2git.git
$ git remote -v
$ exit

repo-ikou28.png

マスターリポジトリのクローン

作成したGitリポジトリをローカルにクローンします。

$ mkdir -p /tmp/git && cd /tmp/git
$ git clone git@gitserver:cvs2git.git

repo-ikou29.png

ローカルリポジトリの更新

リモートリポジトリから取得したローカルリポジトリから、CVSROOTモジュールを削除しマスターリポジトリに送信します。

$ cd cvs2git
$ git rm -r CVSROOT
$ git commit -m 'DELETE CVSROOT'
$ git push origin master

repo-ikou30.png
repo-ikou31.png

以上で、CVSリポジトリをGitリポジトリに移行できます。

CVSからMercurialリポジトリに移行する

CVSリポジトリをMercurialリポジトリに変換するには、Mercurialの拡張コマンドconvertを使用します。

これまでのように、一括変換ができませんので、移行するCVSリポジトリごとに変換する必要があります。

CVSリポジトリのアクセス権変更

hgユーザーでCVSリポジトリにアクセスするため、CVSリポジトリのアクセス権を変更します。

なお、本処理は先に作成したCVSリポジトリに対してhgユーザーの書込権限が無いために行っています。

Otherユーザーに書込権限が設定されているCVSリポジトリの場合は、アクセス権を再設定する必要はありません。

$ chmod 0777 ~/cvsrepo/CVSROOT ~/cvsrepo/cvstest

repo-ikou32.png

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

repo-ikou33.png
repo-ikou34.png

CVSリポジトリのチェックアウト

hgユーザーでMercurialサーバーに接続し、移行するCVSリポジトリをチェックアウトします。

$ ssh hg@hgserver
$ mkdir ~/tmp && cd ~/tmp
$ cvs -d ~vagrant/cvsrepo co cvstest

repo-ikou35.png

リポジトリの変換

CVSリポジトリをMercurialリポジトリに変換します。

Mercurial拡張コマンドが利用できるように、~/.hgrcを下記のとおり編集します。

[convert]
cvsps = cvsps -A -u --cvs-direct -q

[extensions]
hgext.convert =

repo-ikou36.png

修正が終了したら、リポジトリを変換しログアウトします。

$ hg convert cvstest ~/cvs2hg.hg
$ exit

repo-ikou37.png

リモートリポジトリのクローン

作成したMercurialリポジトリをクローンします。

$ mkdir -p /tmp/hg && cd /tmp/hg
$ hg clone ssh://hg@hgserver/cvs2hg.hg

repo-ikou38.png
repo-ikou39.png

以上で、CVSリポジトリをMercurialリポジトリに移行できます。

ノート

なお、本記事で使用しているhgコマンドのバージョンは、1.4で、公式ドキュメント では、cvsps を必要としないとなっていますが、cvsps を使う設定を ~/.hg に設定しないと変換が失敗することがあったため、今回は設定して変換しています。

また、変換も成功したり、失敗したりと動作が不安定になりがちですので、CVS→Mercurialに変換する場合、CVS -> Git -> Mercurialという順で一括変換することをお勧めします。

repo-ikou40.png

まとめ

ここまで、CVSリポジトリをSVN/Git/Mercurialリポジトリに移行する方法を解説しました。次回は、今回取り上げなかったその他のリポジトリの移行方法について解説します。

repo-ikou42.png


社内サーバにリモートリポジトリを作るのも一つですが、「開発にまつわる面倒事」をこの際全部、tracpath(トラックパス)に任せてみませんか?
バージョン管理サービス・プロジェクト管理サービスの「tracpath(トラックパス)」では、
ユーザー5名、リポジトリ数3つまで、無料で利用可能です。

さっそく実務でも使って見ましょう。
自らも開発を行う会社が作ったからこそ、開発チームの「作る情熱」を支える、やるべきことに集中出来るサービスになっています。
エンタープライズ利用が前提のASPサービスなので、セキュリティも強固です。