git で CVS と仲良くする方法

CVS なんて○○だ!」と Linus センセイの様に断言できたら良いですが(いや, 断言してますが), かと言って布教にかけるコストがアレなので, 自分だけ Git で作業するために, git cvsimport/exportcommit を使っています. 某所よりリクエストがあったので, メモを残しておきます.

git cvsimport

cvs で管理されているリポジトリから, 手元に git clone するためには git cvsimport を使います. 初回に一度やれば良いのですが, 普通にやったら微妙に author とか変だったので, とりあえず authors.txt を作成しておきます.

 $ cat authors.txt
 uwabami=Youhei SASAKI <uwabami@gfd-dennou.org>
 ...

そんでもって

 $ git cvsimport      \
   -v                 \
   -A authors.txt     \
   -d PATH_TO_CVSROOT \
   -C MODULE_NAME     \
   GIT_REPOS_NAME

みたいに.

  • PATH_TO_CVSROOT は :pserver: とか :ext とか.
  • -A authors.txt は非推奨らしいですが, コレをやっておかないと git log のメールアドレス等が悲しくなります.
  • MODULE_NAME は CVSROOT から取得したいモジュール名
  • GIT_REPOS_NAME は作成したい git のリポジトリ

CVSリポジトリを置いてあるサーバで git と cvsps が動作しないと駄目です. 無ければ適当に install しておきましょう(もしくは管理者にお願いしましょう).

初回取得時は, コミット数に応じてそれなりに時間がかかります. Delta か DAG か, という違いです. 取得したら git gc しておくと良いでしょう. あとは普通に git リポジトリの様に作業します.
面倒なのは CVS の変更点の取得です. git pull/fetch, git svn rebase みたいにはできないみたいで, 毎度上記コマンドラインを叩く必要があります(Makefile でも書いておくと良いかな). 当然ながら, 既に取得した CVS のコミットを再度取得することは無いですが.

git cvsexportcommit

手元で作業した内容を, 御本尊の CVS リポジトリにコミットするには git cvsexportcommit を使います. しかしながら, 面倒なのは CVSROOT に直接コミットできないことですかね.

  • cvs の working copy に git からコミット
  • cvs で CVSROOT へコミット

という二段構成になります.

 git cvsexportcommit \
 -v \
 -w PATH_TO_CVS_WORKING_COPY \
 COMMIT_HASH
  • PATH_TO_CVS_WORKING_COPY は cvs checkout した CVS の working copy
  • COMMIT_HASH は git のコミットハッシュ値. 省略した場合は cvsimport した所から git の HEAD まで全て

です. うまくいったら, CVS の作業コピーで今迄通り cvs commit します.

感想

エラい面倒です. Git とは言いませんが, せめて Subversion に移行してくれませんか, とか*1.

以上, またもやくだらないお話しでした.

*1:CVSROOT を rsync して手元にコピーしている, と聞いた時は憤死しそうになった. それなら Git で良いじゃんかヽ(`Д´)ノウワァァァン!!