Oct 22, 2008
[Subversion] Subversion リポジトリに対する commit を禁止する方法
Subversion のメンテナンスについて触れたので、 ついでに Subversion リポジトリのメンテナンスを実施する際に必要な commit 禁止の設定方法を書いておく。 Subversion リポジトリへの commit 禁止はリポジトリフックの start-commit を使用すると簡単に実現できる。
- Version Control with Subversion - start-commit Repository Hooks
- http://svnbook.red-bean.com/en/1.5/svn.ref.reposhooks.start-commit.html
start-commit フックの作成
Subversin リポジトリホーム($REPOS) に hooks というリポジトリフックをを格納する場所が用意されているので、その中に start-commit というファイルを作成する。
テンプレートが用意されているので、それをコピーしてもいい。
作成後は実行権限とアクセス権限を適切なものに変更すること。
$REPOS/hooks/start-commit
#!/bin/sh REPOS="$1" USER="$2" if [ -e "$REPOS/commit.lock" ]; then echo "Service temporary unavailable." 1>&2 exit 1 fi exit 0
commit の禁止方法
$REPOS/commit.lock というファイルを作成するとリポジトリに対する全ての commit が禁止される。
この状態でクライアントから commit を実行すると、クライアント側には "Service temporary unavailable." というメッセージが表示され commit が失敗する。 $REPOS/commit.lock を削除すれば再度 commit が可能になる。$ touch $REPOS/commit.lock
commit 以外の更新処理
私のところでは commit 以外の更新系処理に関しても同様にリポジトリの保守前にアクセス制限をかけている。 それぞれのリポジトリフックは以下の通り。下記のリポジトリフックを使用した場合、
- $REPOS/access.lock ・・・ commit, revporp, lock, unlock を全て禁止
- $REPOS/commit.lock ・・・ commit を禁止
- $REPOS/revporp.lock ・・・ revprop を禁止
- $REPOS/lock.lock ・・・ lock を禁止
- $REPOS/unlock.lock ・・・ unlock を禁止
$REPOS/hooks/start-commit
#!/bin/sh REPOS="$1" USER="$2" if [ -e "$REPOS/access.lock" -o -e "$REPOS/commit.lock" ]; then echo "Service temporary unavailable." 1>&2 exit 1 fi exit 0
$REPOS/hooks/pre-revprop-change
#!/bin/sh REPOS="$1" REV="$2" USER="$3" PROPNAME="$4" if [ -e "$REPOS/access.lock" -o -e "$REPOS/revprop.lock" ]; then echo "Service temporary unavailable." 1>&2 exit 1 fi if [ "$PROPNAME" = "svn:log" ]; then exit 0; fi exit 1
$REPOS/hooks/pre-lock
#!/bin/sh REPOS="$1" FILE="$2" USER="$3" if [ -e "$REPOS/access.lock" -o -e "$REPOS/lock.lock" ]; then echo "Service temporary unavailable." 1>&2 exit 1 fi exit 0
$REPOS/hooks/pre-unlock
#!/bin/sh REPOS="$1" FILE="$2" USER="$3" if [ -e "$REPOS/access.lock" -o -e "$REPOS/unlock.lock" ]; then echo "Service temporary unavailable." 1>&2 exit 1 fi exit 0



