●http://subversion.tigris.org/
●http://subversion.bluegate.org/
●google:subversion
●googlej:subversion
cvsよりも便利なバージョン管理システム。
一旦使えるようになってしまえば便利だが、インストールして一通り使える環境を整えるのは、かなりハード。
以下の覚え書きは、pw:subversion+viewcvsインストールを前提としている。
●おぼえがき
●なんかよく分からないがcommitがOut of dateのトランザクションの何とかで失敗した時
●.cvsignoreみたいな事をするには
●.subversion/config
●cvs add -kb binfileをするには
●チェックアウト
●chmod a+x
●新しいリポジトリを作る
●コミットログの修正
●auto-propsでキーワード置換を設定しても動かない時
●その他
●cvsから移行してきた人が注意すべき点
●自分用
●省略コミットログの意味
おぼえがき
なんかよく分からないがcommitがOut of dateのトランザクションの何とかで失敗した時
●以前にmvやcpやrmを行った時に起こりやすい気がする。
●一旦、svn upを実行してから再commitすればok。
●リポジトリを一人だけで使っている時にも起こる。
.cvsignoreみたいな事をするには
svn propedit svn:ignore . --editor-cmd vim
●あとは、ココにファイル一覧を改行区切りで書く(*使用可)。
●svn:ignoreはディレクトリに対して設定を行う、という事だけ憶えておけばok。
.subversion/config
[miscellany]
log-encoding = euc-jp
enable-auto-props = yes
[auto-props]
* = svn:keywords=Id Date Author Rev URL
●﹁log-encoding = euc-jp﹂で、euc-jpで入力したコミットログは自動的にutf-8に変換されてからリポジトリに記録されるようになる。
●localeが正しく設定されている環境では不要。また、コミットログをascii/utf-8で書く人にも不要。
●﹁enable-auto-props = yes﹂と﹁* = svn:keywords=Id Date Author Rev URL﹂によって、cvs同様のキーワード置換が常に有効になる。
●但し、この設定にしてしまうと、バイナリファイルは明示的に、キーワード置換しないように、add/import時に注意しなくてはならなくなる。
●cvsとは違い、subversionでは、いきなりディレクトリ丸ごとadd/importが可能なので、丸ごと追加時にも、この事を忘れないようにする事(追加したディレクトリ内にバイナリファイルが無いかどうか気を付ける事)。
●忘れていて、あとで気付いた場合は、以下のようにして戻す。cvsとは違い、リポジトリ内部ではキーワード置換はされていないので、リポジトリ内のバイナリファイル自体が破損されてしまう事は無い。
svn propdel svn:keywords binfile.tgz
●キーワード置換対象か否かを確認する
svn proplist binfile.tgz
この結果、svn:keywordsが含まれているなら、キーワード置換が有効になっている。
cvs add -kb binfileをするには
svn add --no-auto-props binfile.tgz
チェックアウト
svn co file:///home/svn/repos/リポジトリ名
または
svn co svn+ssh://サーバ名/home/svn/repos/リポジトリ名
但し、tagsやbranches等がある場合、それらも含めてチェックアウトしてしまうと、サイズが何十倍にもふくれあがってしまうので、trunkディレクトリが存在するなら、trunkディレクトリのみチェックアウトすると良い。
svn co file:///home/svn/repos/リポジトリ名/trunk チェックアウト後のディレクトリ名
または
svn co svn+ssh://サーバ名/home/svn/repos/リポジトリ名/trunk ディレクトリ名
chmod a+x
●chmod a+x
svn propset svn:executable 1 hoge.sh
●chmod a-x
svn propdel svn:executable hoge.sh
新しいリポジトリを作る
(
TARGET=新しいリポジトリディレクトリ名
umask 002
svnadmin create --fs-type fsfs /home/svn/repos/$TARGET
echo -n '#!/bin/sh
REPOS="$1"
REV="$2"
cd /home/svn/viewcvs
./svndbadmin rebuild "$REPOS" "$REV"
' > /home/svn/repos/$TARGET/hooks/post-commit
chmod 775 /home/svn/repos/$TARGET/hooks/post-commit
cd /home/svn/viewcvs
./svndbadmin rebuild /home/svn/repos/$TARGET
)
これで、fsfsでリポジトリを作成し、リポジトリをgroup writableに保ち、viewcvsのmysqlキャッシュに新しいリポジトリの場所を確保し、リポジトリ更新時にmysqlキャッシュも更新するようになる。
●umask 002にしないと、リポジトリがg+wにならない。
●svnadminではなく、svnコマンドなら、g+wになるので、普段は問題無いが、リポジトリ作成時だけ問題になる。何故、そういう仕様なのかは不明。修正される気配も無い。
●fsfsはbdbと比べて、枯れていないが、より頑健。但し、一つのディレクトリ内に大量のファイルを保存する為、ext2, 3の上で使用すると、パフォーマンスは非常に悪くなる。reiserfsやxfsが必要。
●post-commitスクリプトが、viewcvsの為に、mysql内にリポジトリの状態を反映する。コレが不要ならumaskとsvnadminだけで良い。
●commit通知メールが必要な場合は、post-commitスクリプトに更に色々追加する事。
コミットログの修正
$REPOSが修正したいリポジトリの名前、﹁file:///home/svn/repos﹂がリポジトリ置き場、とする。
REPOS=test
cd /home/svn/repos/$REPOS/hooks
cp pre-revprop-change.tmpl pre-revprop-change
chmod a+x pre-revprop-change
svn propset \
--encoding=euc-jp \
--revprop -r リビジョン番号 \
svn:log '新しいコミットログ' \
file:///home/svn/repos/$REPOS
rm pre-revprop-change
●propset時には、.subversion/configで指定したlog-encodingは見てくれないので、明示的に--encoding=euc-jpを指定する必要がある。
auto-propsでキーワード置換を設定しても動かない時
●正誤表
●.subversion/config から
[auto-props]
○ *.txt = svn:keywords=Id
× *.txt = svn:keywords="Id" # 「"」が付いてしまう
× *.txt = svn:keywords Id # 「svn:keywords Id」という名前
○ Makefile = svn:keywords=Id Date Author
× Makefile = svn:keywords="Id Date Author" # 「"Id」「Date」「Author"」の三つ
●コマンドラインから
○ $ svn propset svn:keywords Id hoge.txt
○ $ svn propset svn:keywords "Id" hoge.txt
○ $ svn propset svn:keywords "Id Date Author" Makefile
× $ svn propset svn:keywords Id Date Author Makefile
その他
●~/.subversionが存在しない時は、
svn help
を実行すれば、サンプルが勝手に作られる。
●……が、全然実用的なサンプルを作ってくれない。
●消したファイル/ディレクトリを復活させるには
cd消したファイルを復活させたいディレクトリ
svn cp -r まだ該当ファイルが存在していた頃のリビジョン \
svn+ssh://サーバ名/home/svn/repos/リポジトリ名/消したファイルのpath .
cvsから移行してきた人が注意すべき点
●cvs updateの代わりに実行するのは、svn status。
●svn statusは、リポジトリ本体とは通信せずに、.svnに保存されている、リポジトリのコピーと現在の作業ファイルとの状態を比較する。
●svn updateは、リポジトリ本体と通信を行い、.svn内のリポジトリのコピーを更新する。破壊的。
●なので、普段はsvn statusを行うように心掛け、作業の開始前とcommitの直後にのみ、svn updateを行うように習慣付ける事。
●コミットログは内部ではutf-8で保存され、また、utf-8以外のエンコーディングは基本的に受け付けない(エラーになる)。
●但し、localeが正しく設定されていれば、そのlocaleのエンコーディングでコミットログを送ると、自動的にutf-8に変換してくれる。
●localeが正しく設定されていない場合は、--encodingオプション、または~/.subversion/configを使ってコミットログのエンコーディング指定を行う必要がある。
●このutf-8で保存されたコミットログをsvn logコマンドで正しく日本語表示させる為にも、localeが正しく設定されている必要がある。
●localeが正しくない環境では、何故かutf-8がuriエンコーディング?されてしまって表示され、lvやjlessに流し込んでも元の日本語を読む事が出来ない。
●その場合は、諦めて、viewcvs経由で読む事。
●cvsとは違い、ディレクトリやファイルの名前変更/再配置が容易なので、名前や設置場所等に悩む前に、とりあえずリポジトリに突っ込む。あとで、キチンとした名前や設置位置を思い付いた時に、変更すれば良い。
●コレに慣れると、もうcvsには戻れない。
自分用
省略コミットログの意味
※これは、編集内容をコミットログに残すまでもない時にのみ使います。普段はちゃんと、コミットログには編集内容を自然言語で残しましょう。
add,cp,mkdir,rm等のsvnコマンド
そのままの意味
note
コメント内容の追記編集削除や、ドキュメント整備のみ
rename
ファイル名変更(移動とは意味合いが微妙に違う)
move
ファイル位置移動(主に違うディレクトリへの移動に使う)
modify
小さな変更(修正ではなく、機能拡張的な意味で)
fix
小さなバグ修正(アルゴリズム的な)
correct
小さな訂正(文言やtypo等、非アルゴリズム的な)
separate,merge
一つのファイルを分割して複数のファイルにした、またはその逆
tmp
一時的なファイル操作(ファイルのswap時など)
save
(未完成時の)途中保存