svn提交后脚本从命令行运行,但在将文件提交到svn时不运行

svn提交后脚本从命令行运行,但在将文件提交到svn时不运行,svn,post-commit,svn-hooks,post-commit-hook,Svn,Post Commit,Svn Hooks,Post Commit Hook,我在svn中有一个post-commit钩子,当我运行它时,它可以从命令行正常运行 env - ./foo.sh /path/to/svn/repos/ 12345 但是当从svn调用脚本时,它似乎不起作用 我所做的基本工作是检查提交的文件,如果某个文件被修改,我会将其svn导出到网络共享。从命令行可以很好地工作 提交后脚本如下所示: #/垃圾箱/垃圾箱 REPOS=“$1” REV=“$2” 已更改=`/usr/bin/svnlook已更改-r“$REV”“$REPOS”` SOURCE=“

我在svn中有一个post-commit钩子,当我运行它时,它可以从命令行正常运行

env - ./foo.sh /path/to/svn/repos/ 12345
但是当从svn调用脚本时,它似乎不起作用

我所做的基本工作是检查提交的文件,如果某个文件被修改,我会将其svn导出到网络共享。从命令行可以很好地工作

提交后脚本如下所示:

#/垃圾箱/垃圾箱
REPOS=“$1”
REV=“$2”
已更改=`/usr/bin/svnlook已更改-r“$REV”“$REPOS”`
SOURCE=“svn+ssh://localhost/path/to/svn/repos/somefile.zip"
DEST=“/mnt/build/somefile-r$REV.zip”
如果[[“$CHANGED”=~“trunk/somedir/somefile.zip”]]
然后
`/usr/bin/svn导出--非交互式--信任服务器证书$SOURCE$DEST`
fi
出口0

当脚本运行时,或者特别是svn导出行(我认为可能存在问题)是否有方法将任何错误消息输出到文件?

钩子脚本的标准输出被丢弃,但标准错误返回到客户端,至少在最近的Subversion版本中是如此。我以为这样已经有一段时间了,但是SVN1.4的书中说输出被丢弃了,所以你可能想检查一下你运行的是最新版本的服务器——查看标准错误流是一个很好的方法来获得常见错误类型的早期警告

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

command >/path/to/logfile 2>&1
使用
>
而不是
附加到文件:

command >>/path/to/logfile 2>&1
因为标准错误输出被发送回svn客户机,所以您也可以通过这种方式将标准输出中的信息传递回svn客户机,无论是对于单个命令

command 1>&2
或者对于整个剧本

exec 1>&2
在脚本的顶部

乍一看,我确实看到了您的脚本的一个问题:假设svn导出行上的反引号不是标记的人工制品,您应该删除它们。(它们将执行您编写的导出命令,然后获取其输出,并将该输出作为另一个命令执行——几乎肯定不是您想要的。)


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

谢谢!最后,我在脚本的顶部添加了“exec>>/tmp/foo.log”。出于好奇,我发现从svn调用脚本时,脚本是作为签入文件的用户运行的。从使用svn+ssh://方案切换到file://解决了这个问题
if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]]
then
        /usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST 1>&2
fi