SVN的post-commit命令行脚本运行,但没有提交文件时)到SVN
-
23-09-2019 - |
题
我有一个提交后在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导出行(其中我觉得可能是一个问题)?
解决方案
来自钩脚本的标准输出被丢弃,但是标准误差返回到客户端,至少在最新版本的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双方括号测试语法,这对我来说一个不错的新发现!)
不隶属于 StackOverflow