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 |
もし既に管理対象のファイルがあれば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.cvsとtv.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.cvsにtvと同じサブディレクトリ構造を作り、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 |