你能指导我如何做吗 svnlook 正在下面工作。我想将其包含在一个钩子中,以防止在下面的标签中提交 /tags:

$SVNLOOK changed -t "$TXN" "$REPOS" | grep "^U\W.*\/tags\/" && /bin/echo "Cannot commit to tags!" 1>&2 && exit 1
有帮助吗?

解决方案

如果 Subversion 预提交挂钩返回退出代码,则允许提交通过 0. 。否则,预提交挂钩将 失败 并且提交将不会被处理。

$SVNLOOK changed -t "$TXN" "$REPOS" 将显示以下变化 $REPOS 发生在 $TXN. 。shell 变量必须由您设置。如果你看一下 pre-commit Subversion 附带的脚本,你会看到:

$TXN=$1
$REPO=$2

的输出 svnlook changed 命令看起来像这样:

$ $SVNLOOK changed -t $TXN $REPOS
A   trunk/vendors/deli/
A   trunk/vendors/deli/chips.txt
A   trunk/vendors/deli/sandwich.txt
A   trunk/vendors/deli/pickle.txt
U   trunk/vendors/baker/bagel.txt
_U  trunk/vendors/baker/croissant.txt
UU  trunk/vendors/baker/pretzel.txt
D   trunk/vendors/baker/baguette.txt

第一列是某事是否 U普拉特, A已添加,或 D已入选。第二列指的是属性。

其余部分是所操作的文件的名称。你可以看到 baguette.txt 已被删除,并且该属性 croissant.txt 已更改,但文件本身未更新。

假设有人试图更改标签。的输出 svnlook changed 看起来像这样:

$SVNLOOK changed -t $TXN $REPOS
U   tags/4.2.1/vendors/baker/bagel.txt

grep 命令是这样的:

grep "^U\W.*\/tags\/" 

这是寻找以以下开头的行 ^U 这意味着这是一个更新。然后,它查找以以下内容开头的字符串 /tags. 。嗯...这可能是一个问题。它与输出不匹配 svnlook changed 命令。

也许应该是:

grep -q "^U.[[\s+tags/"

这将匹配任何以以下开头的字符串 U, ,可能后跟另一个字符,后跟空格,然后紧接着单词 tags/.

您可能想验证该表达式。

&& 是一个 列表运算符. 。如果左边的表达式 && 执行成功(即它返回零退出代码),右侧的语句将被执行。否则,右边的语句不会被执行。

因此,如果您的 grep 匹配一个看起来像有人更新了标签的模式,这将是真的。右侧的声明 && 将被执行。

因此,

/bin/echo "Cannot commit to tags!" 1>&2

将被执行。这将被发送到 STDERR,而 STDERR 将被发送到 Subversion 客户端,但前提是预提交挂钩的退出代码为零。

因此下一个列表运算符命令 exit 1 将执行,如果 /bin/echo 是成功的。(可能不是,但通常会是)。这样,预提交钩子就会以非零退出代码退出,钩子失败,并且 Cannot commit to tags! 会发送到SVN客户端供用户查看。

世界上绝对没有理由让这个声明看起来像这样。这几乎是等价的,并且更容易理解:

if $SVNLOOK changed -t $TXN $REPOS | grep -q "^U.[[\s+tags/"
then
    /bin/echo "Cannot commit to tags!" 1>&2"
    exit 1
fi
exit 0

毕竟,您需要将其放入名为的 shell 脚本中 pre-commit 无论如何并且有 shell 变量 $SVNLOOK, $REPOS, , 和 $TXN 无论如何设置。

这并不完全相同的原因是,即使 /bin/echo 失败。


如果您正在寻找预提交挂钩来控制标签,您应该看看 . 。这已经在数百个站点上进行了测试,并且将使您能够更好地控制存储库并进行更好的错误检查。

该挂钩使用控制文件来控制对存储库的访问。例如,您可能希望能够在必要时让自己更改标签。

[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/**
access = read-only
users = @ALL

[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/
access = add-only
users = @ALL

[file I can modify and delete tags]
file = /tags/**
access = read-write
users = jazzr

看看钩子。它适用于标准 Perl 5.8.8 安装及更高版本。它不需要其他模块。但是,如果您使用 LDAP 或 Active Directory 进行 Subversion 访问控制,则可以安装 Net::LDAP Perl 模块并在预提交挂钩中使用 LDAP 或 Active Directory 组进行访问控制。

其他提示

$SVNLOOK changed -t "$TXN" "$REPOS" 打印所有已更改的路径。有关参数的更多信息,请参见此处:http://svnbook.red-bean.com/en/1.7/svn.ref.svnlook.c.changed.html

接下来,更改的路径列表将通过管道传输到 grep 中,该命令检查路径中是否有任何包含“/tags/”的更改, | grep "^U\W.*\/tags\/".

&& 是 shell 中的 AND 运算符。如果 grep 命令找到匹配项,它将返回状态代码 0,在本例中相当于“TRUE”,并且 && 之后的命令将执行,否则不会执行。

&& 之后的部分, /bin/echo "Cannot commit to tags!" 1>&2 运行 echo 命令并将消息从 1(标准输出)写入到 &2(即标准错误)。如果成功,命令将以状态码 1 退出 exit 1. 。这将导致您的挂钩脚本使用非零状态代码返回,并且您的提交将失败返回“不能提交标签!”给用户的消息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top