【问题标题】:How to use svnlook in svn to search changed items如何在 svn 中使用 svnlook 搜索更改的项目
【发布时间】:2014-01-08 18:09:41
【问题描述】:

您能否指导我了解svnlook 在下面的工作方式。我想将它包含在一个钩子中,以防止在/tags 下的标签中提交:

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

【问题讨论】:

    标签: svn svn-hooks svnlook


    【解决方案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
    

    第一列是某物是 Uprated、Added 还是 删除。第二列是指属性。

    其余的是被操作的文件的名称。您可以看到 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 客户端,但前提是 pre-commit 钩子的退出代码为零。

    因此,如果/bin/echo 成功,则将执行下一个列表运算符命令exit 1。 (可能不会,但通常会)。这样,预提交钩子以非零退出代码退出,钩子失败,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 组进行访问控制。

    【讨论】:

      【解决方案2】:

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

      接下来,更改的路径列表将通过管道传输到 grep 中,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 退出。这将导致您的钩子脚本以非零状态代码返回,并且您的提交将无法返回“无法提交到标签!”给用户的消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-08
        • 1970-01-01
        • 2013-01-28
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        相关资源
        最近更新 更多