#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 * リポジトリの整理 ** 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プロジェクト -- 管理が面倒 -- コミットメーリングリスト/権限設定を分けたりが楽 一人で扱う分には割とどうでもいい気がする