SVNでコミットを禁止したい!!フックスクリプトによるコミット拒否の方法

こんにちは。堀部です。
 
今回ご紹介するのはSVNのフックスクリプトを使用して、サーバー側でコミットを拒否する方法です。

  • あるフォルダ配下のファイルを今後一切更新させたくない。
  • 何かの拍子で更新されてしまっては困る。

そういったときに使えるTipsをご紹介します。

フックスクリプトの種類

SVNが用意しているコミット関係のフックスクリプトは以下の3種類があります。
 

スクリプト名 実行タイミング
start-commit コミットトランザクション作成前
pre-commit コミットトランザクション作成後で、コミット直前
post-commit コミット直後(コミットは完了するため拒否することはできない)

今回はあるフォルダ配下のファイルのコミットを拒否しますので pre-commit を使用します。
 
pre-commitは、コミットを拒否したい場合に、0以外の終了コードを返すことでコミットを中断させます。pre-commitが終了コード:0を返すとコミットされます。

フックスクリプトの設置

リポジトリがあるディレクトリの配下に、“hooks”というディレクトリがあります。その中にフックスクリプトのテンプレートファイルがありますのでファイル名前を変更します。
例:pre-commit.tmpl → pre-commit

$ ls repo/hooks/
post-commit.tmpl post-unlock.tmpl pre-revprop-change.tmpl
post-lock.tmpl pre-commit.tmpl pre-unlock.tmpl
post-revprop-change.tmpl pre-lock.tmpl start-commit.tmpl
$

フックスクリプトを編集する

pre-commit を編集して保存します。

$ cd repo/hooks/
[/repo/hooks]$ vi pre-commit

#!/bin/sh

# 対象リポジトリのパス
REPOS="$1"
# トランザクション番号
TXN="$2"

# svnlookのパス
SVNLOOK="/usr/bin/svnlook"

# svnlook のコマンドライン引数
SVNLOOK_CMD="$SVNLOOK changed -t $TXN $REPOS"
# 日本語を読み込む場合に必要
export LANG=jp_JP.UTF-8

for line in `$SVNLOOK_CMD`
do
  # パスに'hoge'という文字列が含まれる場合にコミットを拒否する
  if echo "$line" | grep -E 'hoge' ; then
    echo "コミット禁止!!! : $line" >&2
    exit 1
  fi
done

exit 0

実行属性をつける

実行権限がないと動かないので実行権限をつけておきます。

$ chmod 755 pre-commit

 
コミットを実行すると以下のように操作失敗となり、コミットを禁止することができます。
 
svn1

Apacheのデフォルトlocaleを変更する

エラーメッセージに日本語を使っている場合はこれをやっておかないと以下のエラーが発生します。

[Error output could not be translated from the native locale to UTF-8.]

$ vi /etc/sysconfig/httpd

#HTTPD_LANG=C
#↓コメントアウトを外して「ja_JP.utf8」に変更
HTTPD_LANG=ja_JP.utf8

 
最後にApacheの再起動を行います。
$ service httpd restart

 
コミットを実行すると以下のように操作失敗となり、日本語のメッセージが出力されています。
 
svn2

記事をシェア
MOST VIEWED ARTICLES