- 追加された行はこの色です。
- 削除された行はこの色です。
#contents
* 構築
** リポジトリを作る
svnadmin create /path/to/svn/repos
svnadmin create --fs-type fsfs /path/to/svn/repos
FSFSはBerkeley-DBが使えない場合(NFS上で運用とか)
** プロジェクトをリポジトリに追加
- /tmp/projectA がプロジェクトのファイルがあるディレクトリとする
- /tmp/projectAの中身は下記のようにしておくとよい
-- branches/
-- tags/
-- trunk/
--- プロジェクトのファイル
svn import /tmp/projectA file:///〜/repos/projectA -m 'initial import.'
- /tmp/projectA
-- 絶対パスである必要なし
-- 省略すると .
- file:///〜/repos/projectA
-- file:///〜/repos を指定するとリポジトリのトップにそのプロジェクトが置かれる
-- file:///〜/repos/Foo/Bar と適当に指定することもできる
- -m 'initial import.'
-- commitのメッセージ
* 普段の作業
** チェックアウト
svn co file:///path/to/svn/repos/projectA/trunk projectA
- file:///path/to/svn/repos/projectA/trunk
-- 自分の取得したい範囲を指定
- projectA
-- 展開するときのディレクトリ名
-- 指定しないとこと場合 trunk
svn co svn+ssh://user@host/path/to/svn/repos/projectA/trunk projectA
** ブランチ / タグ付け
- Subversionでは同じ扱い
- コミット対象がブランチ
- コミットしないで分岐時のリビジョンに名前を付ける目的のものがタグ
svn copy file:///〜/repos/projectA/trunk file:///〜/repos/projectA/branches/hoge-branche
svn copy file:///〜/repos/projectA/trunk file:///〜/repos/projectA/tags/release-1.0
*** ブランチのマージ
http://subversion.bluegate.org/doc/ch04s04.html
# trunkのworking copy内で
svn merge -r 分岐したときのリビジョン:最新のリビジョン ブランチのURL
** 属性削除
# 実行属性
svn propdel svn:executable FILELIST
# バイナリ
svn propdel svn:mime-type FILESIT
なんかインポートしたらバイナリだと判断されたものがあったりしたので
** 無視するファイル
# セット
svn propset svn:ignore PATTERN DIR
# 編集
svn propedit svn:ignore DIR
** 昔のファイルを操作
移動 / 別のファイルに置き換えてしまった場合など。~
http://subversion.bluegate.org/doc/ch07s04.html 参照。
svn command -r OPERATIVE-REV item@PEG-REV
リビジョン''PEG-REV''のころの''item''で特定されたオブジェクト(現在は違う名前かも知れない)に対し、~
svn command -r OPERATIVE-REV を実行する。
** リポジトリの中を見る
svn ls URL_OR_PATH [--xml]
svnlook tree /path/to/svn/repos [path/in/repos]
** コミットログ修正
svnadmin setlog --bypass-hooks /path/to/svn/repos -r REV NEWLOGFILE
# 以下 hooks/pre-revprop-change が必要な方法
svnadmin setlog /path/to/svn/repos -r REV NEWLOGFILE
svn propedit --revprop -r REV svn:log
** 指定したリビジョン間で svn status っぽい出力を得る
svn diff -r ARG --summarize
# こちらは1リビジョンでの変更のみ
svnlook changed [-r REV] /path/to/svn/repos
# それぞれのリビジョンでの変更が見られる
svn log [-q] -v [-r ARG]
** ファイルの move の履歴
svnlook history REPOS_PATH [PATH_IN_REPOS]
** 各行の変更者とリビジョン情報の取得
svn blame TARGET
* リポジトリの整理
** dump/load
svnadmin dump /path/to/svn/repos > DUMPFILE
svnadmin load /path/to/svn/repos < DUMPFILE
** リポジトリ分割
svnadmin dump /path/to/svn/repos > DUMPFILE
svndumpfilter --drop-empty-revs --renumber-revs include PATH < DUMPFILE > DUMPFILE_PATH
パスがPATHを含むものだけダンプ。~
svndumpfilter help 参照。~
~--drop-empty-revs --renumber-revsで関係ないリビジョン番号をスキップ。
move/copyなどをした場合はコピー元も含めないと文句を言われる。~
move + リビジョンスキップしたものを load しようとしたら怒られた。~
* svnserve
** svnserveの起動
# 適当な権限のユーザになって
svnserve -d -r /path/to/svn/repos
参考
- svn+sshはsvnserveを起動なくてもいい
- svn+sshはsvnserveとは関係ないのでフルパスで指定しないといけない
** svnserveで管理
- svn://SERVER.NAME なアクセスになってしまう
-- ユーザレベルで動かしてるのにルートっぽいアクセスはないよなぁ・・・
- 設定は /path/to/repos/conf/svnserve.conf が読まれる
* 複数人で管理(svn+ssh / file)
** Berkeley-DB + 全開な方法
リポジトリのdb 777, db/* 666で動いてそうな気がする。
** FSFS + Group手抜きバージョン@研究室
# sは初めからついてる
chmod g+sw db/
chmod g+sw db/*/
chmod g+w db/write-lock db/current
ちなみに NFS のロックではまるのか、コミット時に以下のエラーを吐かれた(昔はそんなことなかった気が。~
svn, version 1.4.0 (r21228)~
NFSのディスクを物理的に持っているマシンからだと成功。
svn: Can't get exclusive lock on file 'REPOS/db/write-lock': No locks available
* その他
** リポジトリレイアウトつれづれ
http://subversion.bluegate.org/doc/book.html#svn-ch-5-sect-6.1 とか参照
- 1つのリポジトリに複数プロジェクトを入れる
-- 管理(フック、定期バックアップ、プロジェクト間のデータ移動など)が楽
-- どれかのプロジェクトが更新されるとリビジョンが増える(リポジトリに対してグローバル)のが気持ち悪い
- 1つのリポジトリに1プロジェクト
-- 管理が面倒
-- コミットメーリングリスト/権限設定を分けたりが楽
一人で扱う分には割とどうでもいい気がする