【问题标题】:How to lock SVN trunk except for merges from branch?除了从分支合并之外,如何锁定 SVN 主干?
【发布时间】:2011-03-11 09:56:35
【问题描述】:

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

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

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

【问题讨论】:

    标签: svn merge branch locking


    【解决方案1】:

    限制对机器人的中继提交。该机器人可以进行无冲突合并并提交到主干。我就是这样做的;它被称为mergebot(麻省理工学院许可)。它是一个守护进程和一个 Trac 插件,提供了一种为每个工单创建一个分支的方法。文档很薄,在极端情况下存在问题,但大多数情况下都能正常工作。

    【讨论】:

      【解决方案2】:

      要只允许合并到主干中,您可以使用预提交挂钩来尝试将合并与普通提交区分开来并拒绝后者。您可以通过检查提交是否更改任何路径上的“svn:mergeinfo”属性来判断提交是否为合并。 This mailing list thread 有两个检查合并信息的钩子示例。这些示例实际上是试图在特定路径上强制其 absence,但如果你反转逻辑,你可以制作一个只接受合并的钩子。

      开发人员仍然有可能在合并过程中故意加入其他更改,并且无法合理地检测到这一点。这样的预提交钩子将温和地提醒开发人员,他们可能打算签入分支而不是主干,但它只有在他们不故意试图绕过策略时才有效。

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

      【讨论】:

        【解决方案3】:

        你不能那样做。他们要么可以写入目录,要么不能。

        但是,您也许可以编写一个预提交挂钩来检测他们是否正在尝试执行此操作并在是这种情况下中止。

        【讨论】:

        • 我认为这会起作用(我们使用预提交挂钩来确保不允许空白签入 cmets),但是,请准备好警告您的用户,因为您尝试收到的错误消息签到不明显。我认为当预提交挂钩失败时无法添加自定义错误消息。
        • @the_mandrill:您在挂钩中写入 STDERR 的任何内容都应该对最终用户可见。
        【解决方案4】:

        让您的开发人员在主干上工作会简单得多,但“直到他们满意”才提交更改。您的开发人员可以更轻松地使用其他开发人员所做的更改来更新他们的代码。

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

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

        【讨论】:

          【解决方案5】:

          无论如何我都不是 SVN 专家,Daniel 的回答很有道理,所以我可能需要 SVN/WebDAV 专家来告诉我为什么这不起作用:

          This page 记录了各种 SVN 命令使用的 WebDAV 方法。您似乎可以通过拒绝用户使用MKACTIVITY 方法的权限来“锁定”commitrmcopymvmkdir。这仍然允许diffmergecheckoutlscat 等。

          那么您需要做的就是在您的 Apache 配置中设置一个 <Limit><LimitExcept> 指令,该指令位于对应于主干目录的 <Location> 指令内。我没有对此进行测试,但它看起来像:

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

          并且您应该能够将其嵌套在存储库的主要 &lt;Location&gt; 指令中。这一切都假设您使用 HTTPS 访问您的存储库。

          【讨论】:

          • svn 的“合并”是一个本地操作,只修改用户的工作副本。它后面必须跟一个“提交”才能有用。因此,不幸的是,锁定“提交”也会阻止合并。
          【解决方案6】:

          您必须设置一个提交挂钩来处理这种情况。但是我不确定您是否真的可以将对主干的提交与对主干的合并分开(可能基于 svn:mergeinfo 更改)...但我建议向开发人员描述对此的需求,而不是强迫它...顺便说一句,必须编写和测试提交脚本,如果您向开发人员解释这一点,我认为这并不是真正需要的努力。

          【讨论】:

            【解决方案7】:

            使用 SVN 权限限制他们对 /trunk 的访问。允许他们阅读,但不允许他们写作。分配一个可以写信给/trunk 的“架构师”角色。当分支准备好时,开发者必须向架构师报告,架构师会手动通过测试,然后合并到/trunk

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-11-08
              • 1970-01-01
              • 2015-09-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-25
              • 2015-03-28
              相关资源
              最近更新 更多