0

我在 svn 中有一个 post-commit 钩子,当我运行时从命令行运行良好

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 书说输出被丢弃了,所以你可能想检查你是否正在运行最新版本的服务器——看到标准错误流是获得常见错误类型早期警告的好方法。

要将命令的输出发送到文件,并将标准错误输出也包含在文件中以将其全部保存在一个位置,请执行

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

使用>>而不是>附加到文件:

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

因为标准错误输出被发送回 svn 客户端,所以您也可以通过这种方式将标准输出中的信息传递回,或者对于单个命令,

command 1>&2

或者对于整个脚本,通过放置

exec 1>&2

在脚本的顶部。

乍一看,我确实看到了您的脚本的一个问题:假设 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 回答