Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何锁定SVN主干(来自分支的合并除外)?_Svn_Merge_Branch_Locking - Fatal编程技术网

如何锁定SVN主干(来自分支的合并除外)?

如何锁定SVN主干(来自分支的合并除外)?,svn,merge,branch,locking,Svn,Merge,Branch,Locking,我想阻止开发人员直接在主干上工作 我的目标是强制所有开发人员离开主干,并在CI测试被清除之前在自己的分支上工作。然后,它们必须从主干合并到分支,以获取最新的更改,运行并通过测试,然后再合并回主干 这种SVN的使用有什么规则吗?您必须设置一个提交钩子来处理这种情况。但是我不确定你是否真的可以将提交到主干和合并到主干分开。合并到主干可能基于svn:mergeinfo更改…但是我建议向开发人员描述这方面的需要,而不是强制执行它…顺便说一句,提交脚本必须编写和测试,如果你解释的话,我认为这不是真正需要的

我想阻止开发人员直接在主干上工作

我的目标是强制所有开发人员离开主干,并在CI测试被清除之前在自己的分支上工作。然后,它们必须从主干合并到分支,以获取最新的更改,运行并通过测试,然后再合并回主干


这种SVN的使用有什么规则吗?

您必须设置一个提交钩子来处理这种情况。但是我不确定你是否真的可以将提交到主干和合并到主干分开。合并到主干可能基于svn:mergeinfo更改…但是我建议向开发人员描述这方面的需要,而不是强制执行它…顺便说一句,提交脚本必须编写和测试,如果你解释的话,我认为这不是真正需要的对于开发者来说,让开发者在主干上工作要简单得多,但在他们满意之前不提交更改。您的开发人员可以更轻松地使用其他开发人员所做的已提交更改更新其代码

您描述的设置更适合于那些在合并更改之前必须获得经理或用户明确授权的开发人员。您还必须手动管理从一个开发人员到其他开发人员的分支更改,这些开发人员的更改需要这些更改。分支到分支合并


我拒绝组中的Cobol开发人员访问SVN trunk。我通过编写自己的Eclipse插件来实现这一点,该插件自动创建分支并执行合并回主干。

您不能这样做。它们要么可以写入目录,要么不能


但是,您可能可以编写一个预提交钩子来检测他们是否正在尝试这样做,如果是这样的话,则中止。

我无论如何都不是SVN专家,Daniel的回答很有道理,因此我可能需要一位SVN/WebDAV专家来告诉我为什么这样做行不通:

记录各种SVN命令使用的WebDAV方法。而且似乎可以通过拒绝用户使用MKACTIVITY方法的权限来锁定commit、rm、copy、mv和mkdir。这仍然允许差异、合并、签出、ls、cat等

因此,您需要做的就是在Apache配置中设置一个或一个与主干目录对应的指令内的指令。我还没有测试过,但它看起来像:

<Location /repo/myproject/trunk>
    ...
    AuthType Digest
    AuthName "Repository Admins Only"
    AuthDigestProvider file
    AuthUserFile "E:/Sites/.htpasswd-admin"
    <Limit MKACTIVITY>
        Require valid-user
    </Limit>
    ...
</Location>

您应该能够将其嵌套在存储库的主指令中。这都是假设您正在使用HTTPS访问存储库。

为了只允许合并到主干中,您可以使用预提交挂钩,尝试区分合并和普通提交,并拒绝后者。您可以通过检查提交是否更改了任何路径上的svn:mergeinfo属性来判断提交是否为合并。有两个钩子示例,用于检查mergeinfo。这些示例实际上是试图在特定路径上强制其不存在,但是如果您反转逻辑,您可以创建一个只接受合并的钩子

开发人员仍有可能在合并过程中故意插入其他更改,而这是不可能检测到的。这样一个预提交钩子可以温和地提醒开发人员,他们可能是想签入一个分支,而不是主干,但它只在他们没有故意绕过策略的情况下起作用


一个更铁的解决方案是将对主干的写访问权限限制为少数用户,您相信他们会做正确的事情。在任何情况下,这些用户都必须执行最后的合并回主干步骤。如果开发人员已经从主干合并到了他们自己的分支,那么最终的合并回来是很容易做到的,因此不会对您信任的用户造成很大的负担。事实上,当开发人员将其分支标记为准备合并时,最终的归并甚至可以通过自动化流程完成。我见过这种自动合并过程的内部实现,但我不知道有任何公开的东西。

限制中继提交给bot。该机器人可以进行无冲突合并并提交到主干。我就是这么做的;这叫做麻省理工学院许可证。它是一个守护进程和一个Trac插件,提供了一种按票证进行分支的方法。文档很薄,在某些情况下会出现问题,但它基本上是有效的。

使用SVN权限限制它们对/trunk的访问。允许他们读,但不允许他们写。分配一个可以写入/trunk的架构师角色。当分支准备就绪时,开发人员必须向架构师报告,架构师将手动通过测试,然后将合并到/trunk中。

我认为这会起作用,我们使用预提交挂钩确保不允许空白签入注释,请准备好警告您的用户,因为您在尝试签入时收到的错误消息并不明显。我不认为有能力添加一个自定义的错误消息时,预通信
钩子失败。@_mandrill:钩子中写入STDERR的任何内容都应该对最终用户可见。svn的合并是一个本地操作,只修改用户的工作副本。它后面必须跟一个commit,这样才有用。因此,不幸的是,锁定提交也会阻止合并。