#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-branch
 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で関係ないリビジョン番号をスキップ。
~--drop-empty-revs --renumber-revsで関係ないリビジョン番号をスキップ。~
load するときにリナンバリングされるのであんまり --renumber-revs は意味ない?~

move/copyなどをした場合はコピー元も含めないと文句を言われる。~

%%move + リビジョンスキップしたものを load しようとしたら怒られた。%%~
最近のバージョンでは解決している。~

** リポジトリの移動後の working copy での処理

 svn switch --relocate FROM_URL TO_URL [PATH ...]

* 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

* Apache2

モジュールを有効化は省略。~
最低限必要なのはこれだけ。~
 <Location /REPOS>
 	DAV svn
 	SVNPath /REPOS_PATH
 </Location>

BASIC認証についての注意書は [[ここ>../トラブル#apache2basic]]。~


Apache2越しは read-only にする。~
ここに Require user などを書けば特定のユーザのみ更新可能に出来る。~
 <LimitExcept GET PROPFIND OPTIONS REPORT>
 	Deny from all
 </LimitExcept>

* その他

** リポジトリレイアウトつれづれ

http://subversion.bluegate.org/doc/book.html#svn-ch-5-sect-6.1 とか参照

- 1つのリポジトリに複数プロジェクトを入れる
-- 管理(フック、定期バックアップ、プロジェクト間のデータ移動など)が楽
-- どれかのプロジェクトが更新されるとリビジョンが増える(リポジトリに対してグローバル)のが気持ち悪い

- 1つのリポジトリに1プロジェクト
-- 管理が面倒
-- コミットメーリングリスト/権限設定を分けたりが楽

一人で扱う分には割とどうでもいい気がする

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS