cvsにいい加減むかついていたのでsvnに移行することにした。
ここはそのsvnのコマンドのメモや、はまったところなどを記録しているメモページです。
環境:w2k
cvsからの移行にはcvs2svnというツールを使うらしい。cvs2svn1.3.1を使ってみた(python2.4)。以下引っ掛かったところ。
python cvs2svn --encoding SHIFT_JIS --use-cvs -s c:/temp/svn/tksqlite c:/doc/cvsroot/tksqliteみたいな。最後まで滞りなく進むとかかった時間などのリポートが表示される。
python cvs2svn --encoding SHIFT_JIS --use-cvs --dumpfile tksqlite.dump --dump-only c:/doc/cvsroot/tksqlite python cvs2svn --encoding SHIFT_JIS --use-cvs --dumpfile hbmark.dump --dump-only c:/doc/cvsroot/hbmark svnadmin create --fs-type fsfs svnroot svn mkdir -m "mkdir hbmark" file:///temp/svnroot/hbmark svn mkdir -m "mkdir tksqlite" file:///temp/svnroot/tksqlite svnadmin load --parent-dir hbmark svnroot < hbmark.dump svnadmin load --parent-dir tksqlite svnroot < tksqlite.dump
リポジトリのレイアウトの仕方は適当っぽい・・・。プロジェクト毎にリポジトリを作ってもいいし、一つのリポジトリに複数のプロジェクトを登録してもいい。どういうのが適切なのかよくわからんが、プロジェクト名の下にtrunk,tags, branchesを作るというのは一応広まってる慣習のようだ。上の例はプロジェクトごとにリポジトリを作る。どっちがいいのかについては「プロジェクトの追加」に両方の利点と欠点が書いてある。レイアウトを決めるときは最初に注意深く計画してくださいみたいなことも書いてある。つうかそういう計画が行き当りばったりだからcvsやめてsvnにしようと思ってるのに・・・。どっちがいいんだろうなあ・・・。
svnではタグやプランチを管理するために、
projname trunk tags branches
のようなディレクトリ構成になっていて、開発はtrunkで行うらしい。チェックアウトするときはこれらのパスに従い、svn co file:///path/to/projname/trunk とかsvn co file:///path/to/projname/trunk projnameとかいうふうにこのディレクトリへのパスを指定する。枝分れしたブランチにタグを付けたりした場合も、projname/tagsに入れるのかな
svnadmin create /path/to/proj svn mkdir file:///path/to/proj/trunk svn mkdir file:///path/to/proj/tags svn mkdir file:///path/to/proj/branches cd path/to/proj svn import file:///path/to/proj/trunkリポジトリにプロジェクトを登録する。svn import [<パス>] URLはパスが省略されたらカレントディレクトリでインポートする。
svn checkout(co) file:///path/to/proj/trunc svn checkout(co) file:///path/to/proj/trunc projパスはfile:///みたいなURLで書く。チェックアウトしたディレクトリ名はpathの最後のディレクトリ名だが、dirで出力先のディレクトリ名を変更することが出来る。
svn co file:///path/to/proj/tags/version1.0 projみたいな。
svn add path ファイルの追加 svn mkdir path ディレクトリを作成してaddする svn delete path ディレクトリやファイルを削除する svn move oldname newname リネーム、移動deleteはファイルはすぐにワーキングディレクトリから消えるが、ディレクトリはコミットするまで残ってるらしい。deleteもmoveもリポジトリに反映させるにはコミットが必要。
svn merge -r M:N file:///path/to/proj/branches/version0.9 svn marge file:///path/to/revM file:///path/to/revN上の例ではversion0.9のブランチでリビジョンMからNの差分をとって、それを現在のワーキングディレクトリに適用する。-r M:Nでリビジョン番号を調べなければならないのがめんどくさい。下の例では、二つのマージ元の差分をとって現在のワーキングディレクトリに適用する。下の例はリビジョン番号を調べないでいいので、タグで管理するときに便利だと思う。
svn commit
svn updateこれはcvs updateと違って、実際にファイルを更新してしまうので、 どれが更新されているか調べるだけの場合は、svn statusを使う。
svn switch pathブランチを指定してcheckoutするのと同じだけど、差分だけやりとりするのでオーバーヘッドが少ないらしい。
svn copy(cp) file:///path/to/proj/trunk file:///path/to/proj/tags/version1.0 -m "version1.0のタグ打ち"ブランチもタグも同じただのリポジトリのコピーらしい。ブランチはbranchesにタグはtags以下にコピーすると決めた運用ルールでタグとブランチを使い分けてねってことらしい。タグを付けて誤って上書きしちゃったりしたらどうなるのか(まあBASEに戻せばいいのだろうが)。とりあえずは基本は常にtrunkのHEADで作業して、タグやブランチを作る時はcopyしていってねってことらしい。ブランチはコピーでもいいけどタグもコピーってのがいまいち納得できない。。。タグはリビジョン番号の別名みたいな感じで使えればいいのに・・・。あとブランチでバージョンの違う枝をバグフィックスし、パッチ番号を上げた新しいタグを作る場合、自分が作業している枝(ブランチ)のURLを記憶してなければコマンドを打てないのがめんどくさい。
svn log <option> file 基本はこんな感じ svn log -r 170 リビジョンを指定 svn log -r 170:175 170から175までのリビジョンの履歴 svn log -r {2006-07-01} 日付は{}でくくる svn log -r HEAD リポジトリで最新 svn log -r BASE 現在のワーキングディレクトリのベース-qオプションでコメント無しの簡易表示。
svn info 現在のワーキングディレクトリの情報を見る svn list(ls) リポジトリ内のls. -Rで子も再帰 svn status ワーキングディレクトリの更新情報 svn status -u リポジトリの更新情報 svn status -v リビジョン番号情報 svn ls file:///path/to/proj/tags タグの一覧はこうするしかない?
svnadmin dump cvnrepos svnadmin load svnreposリポジトリ全体を標準出力に出力/入力。--incrementalで差分を出力。
svnadmin hotcopy old newリポジトリのコピーを作る。他のプロセスが使用中でも使えるらしい。
svnadmin dump path/to/svnroot/ |svndumpfilter exclude tksqlite> dump.logみたいな。これは/tksqlite以下のディレクトリをリポジトリから削除したダンプを出力する。また、/tksqlite以下のアイテムだけを出力する場合はincludeを使って
svnadmin dump path/to/svnroot/ |svndumpfilter include tksqlite> dump.logみたいな。で、ダンプしたやつを新しいリポジトリにsvn loadで流し込んで作業完了。
URLとかパスを書くのがめんどくさい。
http://svn.haxx.se/users/archive-2005-07/0303.shtml
によれば、環境変数にSVNROOTをセットしとけばいいじゃんってことらしい。
まあそうかな・・・。
cvs2svnだとなんかしらんが勝手に.cvsignoreを読んで設定してくれてるみたいだ。
svn propdel <属性名> [<パス>...] svn propedit svn:ignore . エディタが立ち上がるので編集して保存する svn propget svn:ignore <path> 属性の表示。 svn proplist -v src -vで付加情報表示。srcディレクトリのproc表示。 svn propset svn:ignore . -F .cvsignore .cvsignoreを読み込み
これらで設定した属性情報はディレクトリの属性変更としてコミットすることになる。