ソフトウェア設計及び演習2015
鈴木先生のまとめ
svn memo
http://ukai.jp/ の svn概要 のまとめ
Subversion
SubversionはCVSの利用形態をひきつぎつつ問題点を克服した新しいバージョン管理システム
-
はじめからネットワーク対応が考えられている
- WebDAV, svn, svn+ssh
- 差分をやりとり
- リビジョンはリポジトリ単位
- アトミックなコミット
- 複数のファイルの変更も同時にコミットできる
- ブランチ/タグの扱いが違う
- コピーする
- コンテンツをコピーしていないので軽いオペレーション
Subversion リポジトリ
svnのリポジトリはプロジェクトごとに作る リポジトリを越えてファイルの移動がない 参照は svn:externals コミッターが同じ範囲
リポジトリの中身(コンベンション)
trunk/
トランク (CVS HEADのブランチ)
branches/
ブランチ (cvs tag -b)
tags/
タグ (cvs tag)
svnコマンド
% svn コマンド 引数 % svn help % svn helpコマンド
URL リポジトリ リポジトリ + パス
file:/svn/repos http://host/svn/repos svn://host/svn/repos
リビジョン X, X:Y
{DATE} HEAD リポジトリの最新 BASE ワーキングコピー COMMITTED 最後のコミット PREV 最後のコミットの前
svn mkdir - リポジトリにディレクトリを作る
% svn mkdir file:///svn/repos/trunk --This line, and those below, will be ignored-- A file:///svn/repos/trunk Committed revision 1. % svn ls file:///svn/repos trunk/ % svn mkdir -m 'mkdir branches' file:///svn/repos/branches Committed revision 2. % svn mkdir -m 'mkdir tags' file:///svn/repos/tags Committed revision 3.
- svn import directory の中味をリポジトリにいれる
srcディレクトリをtrunkのsrcディレクトリに
% ls src foo.c % svn import src file:///svn/repos/trunk --This line, and those below, will be ignored-- A src Adding src/foo.c Committed revision 4. % svn ls file:///svn/repos/trunk hello/ % svn ls file:///svn/repos/trunk/src foo.c % svn ls -R file:///svn/repos/trunk src/ src/foo.c
svn checkout - リポジトリからワーキングコピーに
trunkのsrcディレクトリを手元に
% svn checkout file:///svn/repos/trunk/src A src/foo.c Checked out revision 4. % ls hello total 20 drwxr-xr-x 3 ukai ukai 4096 May 11 23:58 ./ drwxrwxrwt 10 root root 8192 May 11 23:58 ../ drwxr-xr-x 7 ukai ukai 4096 May 11 23:58 .svn/ -rw-r--r-- 1 ukai ukai 94 May 11 23:58 foo.c % svn info Path: Url: file:///svn/repos/trunk/src Revision: 4 Node Kind: directory Schedule: normal Last Changed Author: ukai Last Changed Rev: 4 Last Changed Date: 2003-05-11 23:55:06 +0900 (Sun, 11 May 2003)
svn status, svn diff - 状態、リポジトリとワーキングコピーの違い
ワーキングコピーで修正
% cd src % vi foo.c % svn status M foo.c % svn diff Index: foo.c =================================================================== --- foo.c (revision 4) +++ foo.c (working copy) ....
svn commit - ワーキングコピーからリポジトリにコミット
% svn commit --This line, and those below, will be ignored-- M foo.c Sending foo.c Transmitting file data . Committed revision 5. % svn status % svn diff
svn update - ワーキングコピーを最新に
リポジトリからワーキングコピーに
% svn update At revision 5.
リポジトリからワーキングコピーにとりだしたリビジョンから、ワーキングコピーで修正されたものがあるか
svn status
svn log
% svn log ------------------------------------------------------------------------ rev 5: ukai | 2003-05-12 00:03:56 +0900 (Mon, 12 May 2003) | 2 lines add . ------------------------------------------------------------------------ rev 4: ukai | 2003-05-11 23:55:06 +0900 (Sun, 11 May 2003) | 2 lines import hello ------------------------------------------------------------------------
svn add - リポジトリにファイルを追加
% vi Makefile % svn add Makefile A Makefile % svn status A Makefile % svn commit --This line, and those below, will be ignored-- A Makefile Adding Makefile Transmitting file data . Committed revision 6. % svn status -u -v 6 6 ukai . 6 6 ukai Makefile 6 5 ukai foo.c Head revision: 6
svn delete - リポジトリからファイルを削除
% svn delete Makefile D Makefile --This line, and those below, will be ignored-- D Makefile Deleting Makefile Committed revision 7. % svn status -u -v 6 6 ukai . 6 5 ukai foo.c Head revision: 7
svn move - ファイルを移動
working copy 内
% svn move foo.c hello.c A hello.c D foo.c % svn status A + hello.c D foo.c % svn commit --This line, and those below, will be ignored-- D foo.c A hello.c Adding hello.c Deleting foo.c Committed revision 8.
移動前のログがちゃんと見られる
% svn log hello.c ------------------------------------------------------------------------ rev 8: ukai | 2003-05-12 00:24:23 +0900 (Mon, 12 May 2003) | 2 lines move foo.c -> hello.c ------------------------------------------------------------------------ rev 5: ukai | 2003-05-12 00:03:56 +0900 (Mon, 12 May 2003) | 2 lines add . ------------------------------------------------------------------------ rev 4: ukai | 2003-05-11 23:55:06 +0900 (Sun, 11 May 2003) | 2 lines import hello ------------------------------------------------------------------------
プロパティ
プロパティ (svn help propset)
-
svn:ignore
- 各行に無視するファイルのパターン (.cvsignore)
-
svn:keywords
- キーワード置換: URL, Author, Date, Rev, Id
-
svn:executable
- chmod +x
-
svn:eol-style
- native, LF, CR, CRLF
- svn:mime-type
- svn:externals
svn prop*
% svn propset svn:keywords Id hello.c property `svn:keywords' set on 'hello.c' % svn commit --This line, and those below, will be ignored-- MM hello.c Sending hello.c Transmitting file data . Committed revision 9. static char rcsid[] = "$Id$"; ↓ static char rcsid[] = "$Id: hello.c 9 2003-05-11 15:36:18Z ukai $"; % svn proplist -v hello.c Properties on 'hello.c': svn:keywords : Id svn propdel 削除 svn propedit 変更 svn propget 取得
svn revert - ワーキングコピーの編集をなかったことにする
% svn status M hello.c % svn revert hello.c Reverted hello.c % svn status
複数人で使う時は
リポジトリのパーミッション
% svn ls file:///svn/repos svn: Couldn't open a repository. svn: Unable to open an ra_local session to URL svn: Unable to open repository 'file:///svn/repos' svn: Berkeley DB error svn: Berkeley DB error while opening environment for filesystem /svn/repos/db: Permission denied
group writableにしておく
umask 002
他の人が修正を既にコミットしていて自分はなにもしてない場合
% svn status % svn update U hello.c Updated to revision 11.
修正がかぶらない場合
% svn status M hello.c % svn update G hello.c Updated to revision 13.
→ マージされる
コンフリクトする場合
% svn status M hello.c % svn update C hello.c Updated to revision 14. % ls hello.c* hello.c hello.c.mine hello.c.r13 hello.c.r14
-
hello.c
- マージしたもの
- コンフリクトマークいり
-
hello.c.mine
- マージする前
-
hello.c.r13
- ワーキングコピー修正前
-
hello.c.r14
- リビジョン最新
コンフリクトの解消
コンフリクトマーク
<<<<<<< .mine ワーキングコピーで修正していたもの ======= リポジトリの内容 >>>>>>> .r14 % svn update At revision 14. % svn status C hello.c ? hello.c.mine ? hello.c.r13 ? hello.c.r14 % svn resolve hello.c Resolved conflicted state of hello.c % ls hello.c* hello.c % svn status % svn update At revision 14.
タグ/ブランチ
- Subversionにおいてはコピー操作。
- タグ/ブランチにあまり区別はない。
- バージョン管理システムを使っていなかった時に近い。
% svn copy file://svn/repos/trunk/hello file:///svn/repos/tags/hello-1.0 --This line, and those below, will be ignored-- A file:///svn/repos/tags/hello-1.0 Committed revision 15. % svn ls -R file:///svn/repos/ branches/ tags/ tags/hello-1.0/ tags/hello-1.0/hello.c trunk/ trunk/hello/ trunk/hello/hello.c
hooksの使い方
リポジトリのhooksディレクトリに.tmpl 拡張子がない実行ファイルを置く。 CVSROOT/管理用ディレクトリと違ってバージョン管理下にはない。
% ls hooks/ post-commit.tmpl pre-commit.tmpl start-commit.tmpl post-revprop-change.tmpl pre-revprop-change.tmpl
例
% cat post-commit #!/bin/sh -e REPOS="$1" cd /path/to/check/out/dir umask 002 svn update `svnlook dirs-changed $REPOS | sed -e 's,trunk/,,'`
リポジトリのバックアップ/リストア
バックアップ
% svnadmin dump /svn/repos rev1 rev2 > dumpfile1 % svnadmin dump /svn/repos rev2+1 rev3 --incremental > dumpfile2 % svnadmin dump /svn/repos rev3+1 rev4 --incremental > dumpfile3
リストア
% svnadmin create /svn/newrepos % svnadmin load /svn/newrepos < dumpfile1 % svnadmin load /svn/newrepos < dumpfile2 % svnadmin load /svn/newrepos < dumpfile3
別の方法
% /usr/lib/subversion/hot-backup.py /svn/repos /var/backups/subversion/
/var/backups/subversion/repos-n-m にリポジトリがバックアップされる
既知の問題点
- アクセスコントロールが貧弱
- ファイル単位で制御できない
- hooksを使う?
- 仕様なども含めて検討中
- どのレイヤにいれるべきか?
- 日本語ファイル名の扱い
- annotate
- svn 1.0以降の予定 svn blame
- symlink/hardlink
- svn 1.0以降
- 仕様が枯れていない
- 認証情報 .svn/ から ~/.subversion
- svn-tunnel-agent=ssh から svn+ssh:
よくあるトラブル
-
パーミッション
- 読み書きできないとdbがオープンできない
- 複数人で使う時は group writable で umask 002
- WebDAVのみに限定して www-data の所有にする
-
アップグレードした後
- svnadmin recover /svn/repos する必要がある場合がある
-
コミット途中にとめた
- ロックが残っている
- svn cleanup でロックを消す
まとめ
-
よりよいCVSをめざしたバージョン管理システム
- ファイルの移動
- コミットがアトミック
-
美しい設計、コーディングスタイル
- HACKING
- 言語バインディング: python, javaなど
- しかしながらまだまだ開発途上 (<< 1.0) 実用に使えるがCVSほど枯れてはいない
最終更新日:2015/03/05 10:01:32