如何在svn中使用svnlook来搜索已更改的项目

时间:2014-01-08 18:09:42

标签: svn svn-hooks svnlook

您能否指导我svnlook如何在下面工作。我希望将其包含在一个钩子中以防止/tags下的标记中的提交:

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

2 个答案:

答案 0 :(得分:1)

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

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

$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 prated, A dded,还是 d 的eleted。第二列是指属性。

其余的是被采取行动的文件的名称。您可以看到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,它将被发送到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

毕竟,你需要将它放在一个名为pre-commit的shell脚本中,并且无论如何都要设置shell变量$SVNLOOK$REPOS$TXN

这个不完全等同的原因是,即使/bin/echo失败,这也会使提交失败。


如果您正在寻找控制标签的预提交挂钩,您应该查看mine。这已在数百个站点上进行了测试,可以让您更好地控制存储库并进行更好的错误检查。

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

[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组进行访问控制。

答案 1 :(得分:0)

$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退出。这将导致您的钩子脚本返回非零状态代码,并且您的提交将无法返回“无法提交标签!”给用户的消息。

相关问题