2017年6月27日火曜日

CVS 死ね死ね団

 業務でバーション管理システムとして CVS を (嫌々) 使わされているけど,CVS を選択するのはもはや犯罪と思っている.(一方で,Linus ほど崇高な考えを持っているわけでは無いので,svn は肯定派)
 さりとて,CVS で十分と思っている人を説得する労力もばかにならない.そもそもリポジトリ容量が増えるという理由で,tar.gz したファイルを cvs add するような人たちに,バージョン管理のなんたるかを説く気力もない.
 そこで,メインリポジトリは CVS のままで,自分だけは svn or git を使う,という運用ができないか? と思っていろいろ調べてみた.

(1) git cvsimport + git cvsexportcommit (参考)
これが一番正統な方法に思えるけど,やってみたら,ウチの CVS リポジトリの幾つかの tag, branch が正常に変換できなかった.(こういう事例はちらほらあるみたい)
というわけでボツ.

(2) git cvsserver
git サーバに CVS サーバエミュレーションを行わせる事ができるらしい.
しかしメインリポジトリフォーマット変換を行う権限など自分には無いので,これは使えない.

(3) svk
svn で git のような分散リポジトリを実現するラッパーツール (らしい).
そのリモートリポジトリは CVS でも良いので,メインリポジトリは CVS のままで,自分は svn リポジトリで開発を行い,開発が終わったら差分を CVS にコミット,のような運用ができそう.
しかし開発が止まっているだけではなく,公開も終わっているようで,svk を入手することはできなかった.

仕方がないので,svk のようなツールを自分で作ることにした.
動作は git で言うところの clone, pull, push だけができる.

●clone の動作
・cvs co する (cvswork と命名)
・cvswork の CVS/ を除く全ファイルを新規 svn リポジトリに import (svnrepos と命名)
・svn co する (work と命名),これがユーザから見えるワーク dir になる
・work の .svn を cvswork にコピー

●pull の動作
・cvswork で cvs up -dP する.この時の標準出力から,追加・削除されたファイルを認識
・追加・削除されたファイルを,cvswork で svn add/del する.
・cvswork で svn ci する
・work で svn up する

●push の動作
・cvswork で svn up する.この時の標準出力から,追加・削除されたファイルを認識
・追加・削除されたファイルを,cvswork で cvs add/del する.
・cvswork で cvs ci する

tag, branch 操作系は一切できないし,一番なんとかしたいマージ系の操作もできないが,それ以外の普段の開発では CVS からは開放されるので,現時点ではこれが精一杯の改善策かな.
てか,CVS 本当に迷惑なんでやめてくださいマジで...