SVNのpre-revprop-changeフックとは何ですか?どのように作成しますか?


168

リポジトリブラウザでログコメントを編集したいのですが、リポジトリにrevprop-changeフックが存在しないというエラーメッセージが表示されました。恐ろしい名前を持っていることに加えて、pre-revprop-changeフックとは何ですか?それをどのように作成しますか?


16
今このリンクは、この質問へのリンクの直後の2番目のリンクです:)
ULysses

についてのリンクは非常に古いSVNBook 1.0につながります。現在のバージョン
bahrep

回答:


52

基本的には、バージョン管理外のプロパティがリポジトリで変更される前に起動されるスクリプトです。これにより、リポジトリで行われていることをより正確に管理できます。

/ hooksサブディレクトリ(* .tmplは、OSに応じて編集し、名前を変更してアクティブ化する必要があります)にある、さまざまなフック用のSVNディストリビューションのテンプレートがあります。


2
すべての手順は、フックテンプレートスクリプトにあります。svnsyncミラーのフックが必要な場合、デフォルトのスクリプトはsvn:logへの変更のみを許可するため、変更する必要があります。Svnsyncはこれ以上の変更exit 0を行うため、すべてのプロパティの変更を許可するために単にそこに配置します(これは私だけのミラーであるため)。
Matt Connolly

...次にpre-revprop-change同じディレクトリに保存し、Webサーバーユーザーが実行できるようにします(Linuxの場合)。
Mateng 2012

209

Windowsの場合、ログメッセージの変更のみを許可するバッチファイルへのリンクを次に示します(他のプロパティは不可)。

http://ayria.livejournal.com/33438.html

基本的に、以下のコードをテキストファイルにコピーして名前を付け、リポジトリのサブディレクトリにpre-revprop-change.bat保存し\hooksます。

@ECHO OFF
:: Set all parameters. Even though most are not used, in case you want to add
:: changes that allow, for example, editing of the author or addition of log messages.
set repository=%1
set revision=%2
set userName=%3
set propertyName=%4
set action=%5

:: Only allow the log message to be changed, but not author, etc.
if /I not "%propertyName%" == "svn:log" goto ERROR_PROPNAME

:: Only allow modification of a log message, not addition or deletion.
if /I not "%action%" == "M" goto ERROR_ACTION

:: Make sure that the new svn:log message is not empty.
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
set bIsEmpty=false
)
if "%bIsEmpty%" == "true" goto ERROR_EMPTY

goto :eof

:ERROR_EMPTY
echo Empty svn:log messages are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:log messages are allowed. >&2
goto ERROR_EXIT

:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1

37
そこにあるバージョンにリンクしている可能性がありますstackoverflow.com/questions/6155/…。そのフックを書いて、SVNフォーラムにしばらく前に投稿しました。私はフックコメントにクレジットを入れるべきだったと思います。
Philibert Perusse 2009

1
このスクリプトをVisualSVN 2.0.8とTortoiseSVN 1.6.11で使用していますが、うまく動作します。
Mark Biek

27
VisualSVNサーバーでリポジトリ名を右クリックし、[プロパティ...]を選択すると、VisualSVNでフックを編集できます。「フック」タブが表示されます。そこには、さまざまなタイプのフックが表示されます。正しいコードを選択し、[編集]をクリックして、上記のコードを貼り付けます。VisualSVNユーザーに役立つことを願っています!
Chuck Le Butt

行を無効にするために私のために働きました:/ I not "%action%" == "M" goto ERROR_ACTION。他の方法では、変更のみが許可されると言い続けました。
Nathan

6
Windowsの迅速で汚れた方法は、hooks \ pre-revprop-change.batという名前の空のファイルを作成することです
Ben Claar

18

Linuxでログコメントの編集を許可するには、

  • リポジトリのディレクトリでファイルpre-revprop-change.tmplを見つけhooksます
  • ファイルを同じディレクトリにコピーし、名前を変更して pre-revprop-change
  • ファイルに実行許可を与える(サーバーユーザーなどwww-data

編集:(lindesに感謝)

  • その後、スクリプトを0編集して、許可したい種類の編集の終了値を返す必要がある場合があります。

これでは不十分です。終了値を適切に変更する必要があります。しかし、とにかく、見るべき正しい場所へのポインタとして役立つと思いました...他のいくつかの回答には欠けている、またはウィンドウ固有の回答を与えています。これをありがとう。
lindes

1
私のUbuntu Linuxバージョンでは、コピーして許可を与えるだけで十分だと思います。でも、もうはっきりとはわかりません。私はそれに応じて答えを編集しました。ありがとう。
Alois Heimer 2016年

さて、2日前に試してみて、このコメントを追加したところ、そのままでは機能しませんでした。しかし、編集すると、この答えは私にとってはうまくいきます。
lindes

11

多くの一般的なフックを含むスタックオーバーフローの質問へのリンクは次のとおりpre-revprop-changeです。

それらは時間の経過とともに改善される可能性があるため、そこで参照する必要があります。


7

おかげで#patmortech

そして、「同じユーザーだけがコードを変更できる」コードを追加しました。

:: Only allow editing of the same user.
for /f "tokens=*" %%a in ( 
'"%VISUALSVN_SERVER%\bin\svnlook.exe" author -r %revision% %repository%') do ( 
set orgAuthor=%%a
)
if /I not "%userName%" == "%orgAuthor%" goto ERROR_SAME_USER

4

フックスクリプトの名前は、解読できればそれほど怖くはありません。これは、リビジョン前のプロパティ変更フックです。要するに、pre-revprop-changeフックスクリプトの目的は、バージョン管理されていない(リビジョン)プロパティの変更を制御し、通知を送信することです(たとえば、リビジョンプロパティが変更されたときに電子メールを送信する)。

Subversionには2種類のプロパティがあります。

  • ファイルおよびディレクトリに設定できるバージョン管理されたプロパティ(svn:needs-lockおよびなどsvn:mime-type
  • リポジトリのリビジョンに設定されているバージョン管理されていない(リビジョン)プロパティ(svn:logおよびなどsvn:date)。

バージョン管理されたプロパティには履歴があり、リポジトリへの読み取り/書き込みアクセス権を持つ通常のユーザーが操作できます。一方、バージョン管理されていないプロパティには履歴がなく、主にメンテナンス目的で使用されます。たとえば、リビジョンをコミットするsvn:dateと、コミットのUTC時間svn:author、ユーザー名、およびsvn:logコミットログメッセージ(指定した場合)がすぐに取得されます。

既に指定したように、pre-revprop-changeフックスクリプトの目的は、リビジョンプロパティの変更を制御することです。リポジトリにアクセスできるすべての人がすべてのリビジョンプロパティを変更できるようにしたくないので、リビジョンプロパティの変更はデフォルトで禁止されています。ユーザーがプロパティを変更できるようにするには、pre-revprop-changeフックを作成する必要があります。

最も単純なフックには、1行だけを含めることができますexit 0。認証されたユーザーがリビジョンプロパティを変更できるようにするため、実際の環境では使用しないでください。Windowsでは、バッチスクリプトまたはPowerShellベースのスクリプトを使用して、pre-revprop-changeフック内にロジックを実装できます。

このPowerShellスクリプトでは、svn:logプロパティのみを変更でき、空のログメッセージは拒否されます。

# Store hook arguments into variables with mnemonic names
$repos    = $args[0]
$rev      = $args[1]
$user     = $args[2]
$propname = $args[3]
$action   = $args[4]

# Only allow changes to svn:log. The author, date and other revision
# properties cannot be changed
if ($propname -ne "svn:log")
{
  [Console]::Error.WriteLine("Only changes to 'svn:log' revision properties are allowed.")
  exit 1
}

# Only allow modifications to svn:log (no addition/overwrite or deletion)
if ($action -ne "M")
{
  [Console]::Error.WriteLine("Only modifications to 'svn:log' revision properties are allowed.")
  exit 2
}

# Read from the standard input while the first non-white-space characters
$datalines = ($input | where {$_.trim() -ne ""})
if ($datalines.length -lt 25)
{
  # Log message is empty. Show the error.
  [Console]::Error.WriteLine("Empty 'svn:log' properties are not allowed.")
  exit 3
}

exit 0

このバッチスクリプトでは、「svnmgr」ユーザーのみがリビジョンプロパティを変更できます。

IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )

exit 1
goto :eof

:label1
exit 0

2

PCユーザーの場合:.bat拡張子は、Windows Serverのマシンで使用すると機能しませんでした。Django Reinhardtが提案したように、私はVisualSvnを使用し、.cmd拡張子の付いたフックを作成しました。


0
  1. SVN repoディレクトリに移動して、サブフォルダー "hooks"に移動します(例: "D:\ SVN \ hooks \")。
  2. そこで空のファイル「pre-revprop-change.bat」を作成します
  3. ファイルに "exit 0"( ""なし)と書き込んで保存します
  4. 楽しい :)

(このソリューションには何もチェック/禁止されていないため、確かに欠点があります。しかし、私の場合-私だけが使用しているローカルリポジトリ-それは機能しているようです。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.