2013年6月21日

超簡単! GITでローカルファイル管理(RCSから移行)

ホームプロジェクトのソースコードの管理には永らくRCSを使ってきた。もう20年以上になる。とっくに時代遅れのツールだということは分かっていたが、オンリーワンのデベロッパーでコンカレンシーは要求されないので…と言い訳をしつつ、ソースコードだけでなくサーバの各種設定ファイルなどもすべてRCS上にある。

Androidのカーネルの仕事をやっていたときは当然GITで、その使いよさには同意していたものの、「アップストリーム」「多人数」というイメージが先行して何となくホームプロジェクトとは別物としてきた。

ここに来て、本業のLinuxカーネルの開発の仕事がパッチ指向になってきて、パッチファイルを生成しなければならなくなり、ローカルにRCSで管理して自作ツールでRCSからパッチファイルを生成するようにしてきたが、どうも使い辛さだけが目立つようになったので思い切ってローカルのファイル管理にもGITを使うことにした。

新規プロジェクト

新規プロジェクトでGITリポジトリの作成は至って簡単。
h@spice:~$ mkdir projects/my_project 
h@spice:~$ cd projects/my_project
h@spice:~/projects/my_project$ git init
これだけ。.gitという隠しディレクトリが作られる。

もし既に管理対象のファイルがあればaddコマンドでステージングしてcommitコマンドでコミットする。
h@spice:~/projects/my_project$ git add .
(addingのメッセージ)
(「git status」でファイルの状況を確認し、不要なファイルがあれば「git rm -r --cached .svn」のようにしてステージングから削除)
h@spice:~/projects/my_project$ git commit

旧来のプロジェクト

すでに存在するプロジェクトのファイルをヒストリを保持したままRCSからGITに変換するのはちと面倒。いくつかの方法があるようだが、こちらのサイトでCVSからGITへの移行を紹介しているのでパクらせていただき、RCSから一旦その発展形であるCVSに変換してからGITに変換する。

ここでは「tv」というディレクトリの下のプロジェクトのRCSファイルを同じレベルの「tv.cvs」を経由して「tv.git」に変換する。

まず、tv.cvstv.gitの準備。
h@spice:~/projects$ mkdir tv.cvs tv.git 
h@spice:~/projects$ cvs -d `pwd`/tv.cvs init
h@spice:~/projects$ (cd tv.git; git init)

次に、tv.cvstvと同じサブディレクトリ構造を作り、tvのRCSファイル(RCS/*,v)をtv.cvsに「本物ファイル」としてコピーする。「RCS」のディレクトリレベルを削除するところに注意。
h@spice:~/projects$ (cd tv; find -type d -exec mkdir -p ../tv.cvs/{} \;) 
h@spice:~/projects$ for i in `(cd tv; find -name '*,v')`; do cp tv/$i tv.cvs/`echo $i | sed 's|/RCS/|/|'`; done

cvs2gitに各種オプションを与えるファイルをローカルにコピーし、必要箇所を変更する。キモはCVSの在り処を示す「r'test-data/main-cvsrepos'」の部分。
h@spice:~/projects$ cd tv.git
h@spice:~/projects/tv.git$ cp /usr/share/doc/cvs2git-2.3.0/cvs2git-example.options cvs2git.optionsh@spice:~/projects/tv.git$ vi cvs2git.options
(編集して変更)
h@spice:~/projects/tv.git$ diff -c /usr/share/doc/cvs2git-2.3.0/cvs2git-example.options cvs2git.options 
*** /usr/share/doc/cvs2git-2.3.0/cvs2git-example.options    Mon Nov 15 21:48:54 2010
--- cvs2git.options    Thu Jun 20 14:41:31 2013
***************
*** 552,558 ****
      # The filesystem path to the part of the CVS repository (*not* a
      # CVS working copy) that should be converted.  This may be a
      # subdirectory (i.e., a module) within a larger CVS repository.
!     r'test-data/main-cvsrepos',
 
      # A list of symbol transformations that can be used to rename
      # symbols in this project.
--- 555,562 ----
      # The filesystem path to the part of the CVS repository (*not* a
      # CVS working copy) that should be converted.  This may be a
      # subdirectory (i.e., a module) within a larger CVS repository.
!     ##r'test-data/main-cvsrepos',
!     r'/home/h/projects/tv.cvs',
 
      # A list of symbol transformations that can be used to rename
      # symbols in this project.

cvs2gitを実行し、GITにインポートする。
h@spice:~/projects/tv.git$ cvs2git --options=cvs2git.options
h@spice:~/projects/tv.git$ cat cvs2svn-tmp/git-blob.dat cvs2svn-tmp/git-dump.dat | git fast-import

この段階で「git status」で見ると全てのファイルが「deleted」状態でステージされているので、アンステージしてやる。
h@spice:~/projects/tv.git$ git reset HEAD .
h@spice:~/projects/tv.git$ checkout -- .

最後に余計なCVSROOTディレクトリを削除すればでき上がり。一時ファイル置き場のcvs2svn-tmp/とかオプションファイルのcvs2git.optionsも残っているが、これらはGITの管理下にはないので単純にrmで削除すればよい。
h@spice:~/projects/tv.git$ git rm -r CVSROOT/
h@spice:~/projects/tv.git$ git commit

RCSは死んだか?

そうは思わない。CVSやGITはプロジェクトを単位とし対象となる全てのファイルがリポジトリにあることをて想定しているが、例えば/etcの下の各種設定ファイルはほとんど他と独立しており、そういう概念とは無縁だ。そう言うことで、今後はプロジェクトファイルは順次GITに変換していくつもりだが、設定ファイルにはRCSを使い続けると思う。

0 件のコメント:

コメントを投稿