CVS は古くから使われている ソフトウェア構成管理システム (またはバージョン管理システム) です。CVS より後の世代である Subversion がすでに広く使われており、git や Mercurial が普及の兆しをみせてきた今となっては、CVS が新しいプロジェクトで採用される機会はほとんどないといえるでしょう。
しかし、CVS を使っている既存のプロジェクトは依然として存在しています。残念なことに PEAR はその一例であり、筆者が開発している Net_UserAgent_Mobile は PEAR の CVS リポジトリにあります。今回は Net_UserAgent_Mobile を例に、CVS リポジトリを git の共用リポジトリへ移行する手順についてご紹介します。
ゴール
今回のゴールは Net_UserAgent_Mobile の CVS リポジトリを git の共用リポジトリに移行することです。
Net_UserAgent_Mobile の CVS リポジトリは HEAD ブランチとタグのみで構成された単純なものであるため、マッピングも単純なものになります。Subversion の場合と異なり、CVS と git のブランチとタグの概念が対応しているため、後述の git cvsimport コマンドにはマッピング用のオプションがありません。
| CVS リポジトリ | git リポジトリ |
|---|---|
| ブランチ (HEAD) | ブランチ (master) |
| タグ | タグ |
git cvsimport
git cvsimport は CVS リポジトリを git にインポートするコマンドです。git cvsimport により CVS リポジトリの一部または全体を git リポジトリに変換することができます。
git cvsimport を実行する
git cvsimport のコマンドラインを構築し実行します。このコマンドは時間がかかるため、本当に動いているか不安にならないよう -v オプションを付けておきましょう。ちなみに Net_UserAgent_Mobile (320 コミット) は 16 分弱かかりました。
また、ここでは -A オプションを使って author を変換するように指示していますが、CVS をメインリポジトリとして使い続ける場合、-A オプションの使用は非推奨とされています。なぜ非推奨とされているのかは不明ですが、意味がない行為であることは明らかです。
$ pwd
/path/to/GITREPOS
$ git cvsimport \
-v \
-d :pserver:kuboa@cvs.php.net:/repository \
-A /path/to/authors.txt \
-C net-useragent-mobile \
pear/Net_UserAgent_Mobile 2>&1 | tee cvsimport.log
/path/to/authors.txt
kuboa=KUBO Atsuhiro <kubo at iteman dot jp>
ローカルリポジトリの状態を確認する
変換が正常に行われたかどうか、git branch と git tag で確認します。
$ pwd /path/to/GITREPOS $ cd net-useragent-mobile $ git branch * master origin $ git tag RELEASE_0_1 ... RELEASE_1_0_0RC3
不要なブランチやタグがあればこの段階で削除しておくといいでしょう。もちろん、共用リポジトリへの反映後に削除することもできます。
マニュアルによると origin ブランチは、CVS の HEAD ブランチがインポートされたもののようです。このブランチは CVS をメインリポジトリとして使い続ける場合に必要になるかもしれません。
ローカルリポジトリの内容を共用リポジトリへ反映する
準備が整ったらローカルリポジトリの内容を共用リポジトリへ反映します。このとき、origin ブランチを転送しないように注意してください。
git remote add origin git@github.com:iteman/net-useragent-mobile.git git push origin master git push --tags
Git の利用を開始する
移行に使った作業用ディレクトリを削除し、改めて git clone を実行します。
$ pwd /path/to/GITREPOS/net-useragent-mobile $ cd .. $ rm -rf net-useragent-mobile $ git clone git@github.com:iteman/net-useragent-mobile.git $ cd net-useragent-mobile $ git branch -a * master origin/HEAD origin/master RELEASE_0_1 ... RELEASE_1_0_0RC3
これで移行は完了です。
git リポジトリの変更を CVS へ反映する
最後に CVS をメインリポジトリとして使い続ける場合に必要となる、CVS に git リポジトリの変更を反映する方法について簡単に解説します。
git cvsexportcommit
CVS をメインリポジトリとして使い続ける場合、git での変更点を CVS へエクスポートする必要があります。git cvsexportcommit はその目的のために使うことができるコマンドです。git cvsexportcommit により git での任意のコミットを CVS 作業ディレクトリに反映することができます。
git cvsexportcommit を実行する
git cvsexportcommit のコマンドラインを構築し実行します。ここでは -w によって変更の反映先となる CVS 作業ディレクトリを指定しています。
$ pwd
/path/to/GITREPOS/net-useragent-mobile
$ git cvsexportcommit \
-v \
-w /path/to/CVSWORK/pear/Net_UserAgent_Mobile \
bba57901533c5d2b76b4dc166c0364e01c97663e
Applying to CVS commit bba57901533c5d2b76b4dc166c0364e01c97663e from parent 09cb0d3ef385c3a8da39f198fffcfd4f76bd1b9c
...
Commit to CVS
Patch title (first comment line): Changed the directory structure. (See http://marc.info/?l=pear-cvs&m=124331221117369&w=2 for more information)
Ready for you to commit, just run:
cvs commit -F .msg ...
問題なく完了すると、最後に cvs commit 用のコマンドラインが出力されます。これを使って CVS リポジトリに変更を反映しましょう。
$ pwd /path/to/CVSWORK/pear/Net_UserAgent_Mobile $ cvs commit -F .msg ...
なお、CVS リポジトリの変更は先述の git cvsimport によってインポートすることができます。その際はインポート済みのパッチはスキップされるため、git cvsimport を何度も同じディレクトリに適用することができます。
使用したソフトウェアのバージョン
| git | 1.6.0.4 |
|---|---|
| cvsps | 2.1 |
| cvs | 1.12.13 |
参考文献
トラックバック(0)
- このブログ記事のトラックバックURL:
