0

実行時にコマンドラインから正常に実行されるコミット後のフックがsvnにあります

env - ./foo.sh /path/to/svn/repos/ 12345

しかし、スクリプトが svn から呼び出されると、機能していないように見えます。

私が基本的に行っているのは、コミットされたファイルをチェックすることです。特定のファイルが変更されている場合は、そのファイルをネットワーク共有に svn エクスポートします。コマンドラインからは正常に動作します。

コミット後のスクリプトは次のとおりです。

#!/bin/sh

REPOS="$1"
REV="$2"

CHANGED=`/usr/bin/svnlook changed -r "$REV" "$REPOS"`
SOURCE="svn+ssh://localhost/path/to/svn/repos/somefile.zip"
DEST="/mnt/build/somefile-r$REV.zip"

if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]]
then
        `/usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST`
fi

exit 0

スクリプトの実行時にエラーメッセージをファイルに出力する方法、または具体的には svn export 行 (問題があると思われる場所) に出力する方法はありますか?

4

1 に答える 1

1

フック スクリプトからの標準出力は破棄されますが、少なくとも最近のバージョンの Subversion では、標準エラーはクライアントに返されます。しばらくこのままだと思っていたのですが、svn 1.4 の本には出力が破棄されると書かれているので、最新バージョンのサーバーを実行しているかどうかを確認してみてください -- 標準エラーを見てください。 stream は、一般的な種類のエラーを早期に警告するのに適した方法です。

コマンドからの出力をファイルに送信し、標準エラー出力もファイルに含めてすべてを 1 か所に保持するには、次のようにします。

command >/path/to/logfile 2>&1

ファイルに追加するの>>ではなく使用します。>

command >>/path/to/logfile 2>&1

標準エラー出力は svn クライアントに送り返されるため、標準出力からの情報をその方法で戻すこともできます。

command 1>&2

または、スクリプト全体に対して、

exec 1>&2

スクリプトの上部にあります。

一見すると、あなたのスクリプトには 1 つの問題があります。svn export 行の逆引用符がマークアップのアーティファクトではないと仮定すると、それらを削除する必要があります。(彼らは、あなたが書いたエクスポート コマンドを実行し、その出力を取得して、その出力を別のコマンドとして実行します。ほとんどの場合、あなたが意図したものではありません。)

if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]]
then
        /usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST 1>&2
fi

(bash の二重角括弧テスト構文については知りませんでした。これは私にとって素晴らしい新しい発見です!)

于 2010-03-31T18:05:24.963 に答える