【问题标题】:svn post-commit script runs from command line, but not when commiting file(s) to svnsvn post-commit 脚本从命令行运行,但在提交文件时不运行)到 svn
【发布时间】:2011-02-03 01:10:08
【问题描述】:

我在 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 导出行(我认为可能存在问题)?

【问题讨论】:

  • 出于好奇,我发现当从 svn 调用该脚本时,它是以签入文件的用户身份运行的。从使用 svn+ssh:// 方案切换到 file:// 而不是修复它

标签: svn post-commit svn-hooks post-commit-hook


【解决方案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 导出行上的反引号不是标记的人工制品,您应该删除它们。 (他们将执行您编写的导出命令,然后获取其输出,并将该输出作为另一个命令执行 - 几乎可以肯定不是您想要的。)

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

(我不知道 bash 中的双方括号测试语法,这对我来说是一个不错的新发现!)

【讨论】:

  • 谢谢!我最终在我的脚本顶部添加了“exec >> /tmp/foo.log”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多