代码之家  ›  专栏  ›  技术社区  ›  martinus

如何禁止颠覆对SVN的承诺:修订之外?

  •  5
  • martinus  · 技术社区  · 15 年前

    我们使用svn:externals对库进行特定的修订,例如

    xyzlib -r12345 https://asdf.asdf.local/xyzlib/trunk/
    

    当您在工作副本中对这样一个签出的外部进行修改时,即使外部链接指向特定的修订而不是头部,也可以提交。

    当你奔跑 svn update 提交之后,更改将在工作副本中消失,因为Subversion会将所有内容还原回修订12345。所以你从来没有真正看到自己的变化,但它们仍然在头脑中,这是坏的。

    只有当外部没有指向头部修订时才可以禁止提交吗?

    4 回复  |  直到 12 年前
        1
  •  3
  •   Erik Finnman    15 年前

    对于这些类型的验证,我还建议使用预提交钩子,但我建议使用类似svnkit的库,而不是编写一个易于理解的脚本。- http://svnkit.com/ (如果你知道Java)。

    我已经使用这个库编写了一些预提交挂钩,使用它非常容易。编写一个小的可运行Java程序,该程序由预提交钩子通过子版本调用。然后,很容易提取出一些属性或部分URL来进行验证,如果提交不适用于您的“规则”,则拒绝提交。

    看看svnlookClient和svnchangeEntry类——它们有最常见的方法(例如,提取正在进行的提交的信息)。

        2
  •  2
  •   nont    15 年前

    你可以尝试这样的方法:使用 pre-commit script 以检查提交是否将转到标记。如果是,那么失败并提供消息。 Read some more about subversion hooks. 您必须重新编写regex,以便它在非head时失败,而不是在标记为if时失败。

    $SVNLOOK changed -t “$TXN” “$REPOS” | egrep -v “^[AD][[:space:]]+(.*/)?tags/[^/]+/$” | egrep “^[^[:space:]]+[[:space:]]+tags/[^/]+/.+”
    if [ $? -eq 0 ] ; then
    echo >&2 “***************************************”
    echo >&2 “* Modification of tags is not allowed *”
    echo >&2 “***************************************”
    exit 1
    fi
    
        3
  •  1
  •   Mike Miller    15 年前

    既然您使用的是HTTPS,我想您使用的是 mod_dav_svn .您可以为您的库存储库设置一个额外的URL,并且只授予对它的只读访问权。这样,即使通常可以提交到库的开发人员也无法通过svn:external提交。

        4
  •  1
  •   zlovelady    15 年前

    如果您没有承诺将外部定义为主干的修订版,为什么不基于该修订版创建一个新标签呢?然后,您可以让svn:external指向标记,并使用文档化的访问控制方法之一限制对标记目录的提交(或者将标记放在不同的repo中并使repo只读)。