Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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
如何在Mercurial DVCS中实施提交策略_Mercurial_Dvcs_Bitbucket - Fatal编程技术网

如何在Mercurial DVCS中实施提交策略

如何在Mercurial DVCS中实施提交策略,mercurial,dvcs,bitbucket,Mercurial,Dvcs,Bitbucket,对于一个小型软件开发,我希望更改遵循一个定义的过程,即集成分支只包含“完整”更改。这个想法来源于我博客上的一篇关于从Mercurial获取信息的帖子。然而,这不仅仅是关于生成日志,而是关于一种结构化的工作方式 总之,这种想法是,一个存储库将有一个“集成”分支,该分支不会直接在其上开发,而是在另一个分支上执行任何工作,完成后将合并到集成分支中-下面是一个粗略的示例,大括号中有提交注释: O {Implemented new feature X} |\ | O {...} | |

对于一个小型软件开发,我希望更改遵循一个定义的过程,即集成分支只包含“完整”更改。这个想法来源于我博客上的一篇关于从Mercurial获取信息的帖子。然而,这不仅仅是关于生成日志,而是关于一种结构化的工作方式

总之,这种想法是,一个存储库将有一个“集成”分支,该分支不会直接在其上开发,而是在另一个分支上执行任何工作,完成后将合并到集成分支中-下面是一个粗略的示例,大括号中有提交注释:

  O   {Implemented new feature X}
  |\
  | O {...}
  | |
  | O {...}
  |/
  O   {Fixed bug 002}
  |\
  | O {...}
  |/
  O   {added tag "Release 1.0"}
  |
  O   {Fixed bug 001}
  |\
  | O {...}
  |/
  O  -- integration branch
 /
O  -- default branch
“集成”分支只允许合并到并标记

这类似于我们在工作中(在基于服务器的非DVCS系统上)进行开发的方式,您在工作分支上进行更改,完成后(并经过审查、测试,…)将这些更改合并到集成分支中,以便进行正式测试和发布

不管怎样,我的问题是——我将如何强制执行只在工作分支上进行更改的策略,而在集成分支上,我们只允许合并或标记

我最初的想法是在
pre-commit
precommit
pretxncommit
)上添加一个钩子,因为我相信这些钩子在创建标记时会被触发)。钩子会检查,如果您在集成分支上,有两个父级,这意味着这是合并的结果,如果不是这样,则会失败

但是,据我所知,在克隆存储库时不会复制挂钩。由于这是一个特定于项目的设置,因此不应在用户级别进行设置。那么,我如何阻止用户克隆存储库(从而丢失钩子),直接在集成分支上进行更改,然后推送

hg clone main_repo
hg update integration_branch
(make changes without starting a new branch)
hg commit -m "I made some changes"
hg push
另外,在使用诸如Bitbucket之类的系统时,我如何强制执行这一点


或者,在使用DVCS时,这不是正确的工作流方法吗?

如果您可以访问中央回购的
hgrc
,您可以定义一个钩子来验证集成分支上的传入变更集是否有两个父级(而第一个必须在集成分支上)。另外,在Bitbucket上,您只能使用设置post检查。这些经纪人不会阻止任何不必要的推送,但如果有人没有遵守规则,他们可能会通知您

然而,就我个人而言,我支持@Zhehao的评论,也就是说,让每个人都遵守规则,让那些违反规则的人给同事端上一周的咖啡(大约,你明白了)


最后,您可以维护一些共享的
hgrc
以及每个开发人员必须在其系统上设置(一次)的相应挂钩。如果在系统上全局设置,则无需为每个克隆重新设置它们。

我想你说过你想要一种“结构化的工作方式”,所以我想知道你想要的是不是代码助理。这意味着这扇门是从里面锁着的,只有中尉打开它,只有中尉把它拉进来时,代码才会点击中央回购。通过审批流程的代码被拉入中央或权威存储库,这是一种“结构化的工作方式”

通过谈论仅在回购协议中拒绝向分支机构写入,而不是拒绝向整个中央回购协议写入,在我听来几乎像是你在问,如何才能去掉DVCS的#1伟大属性,即(a)不只是一个副本,每个副本都可以有自己的读/写访问规则,如果你愿意的话,其中一个副本是中心副本,(b)犯下的罪行与对其他任何人施加的罪行是分开的。提交是本地工作复制操作。直到这些提交到达权威存储库(无论是中心存储库还是由代码租户管理的存储库),您才在这个受控过程中使用DVCS进行了真正的更改

或者您是否认为用户甚至不应该在不进行分支的情况下提交到自己的工作DVCS本地实例中


简言之,你可以说,每台本地机器的工作副本都是一个分支,一个不可见的分支,没有强加给任何人,甚至没有被命名,直到它被负责代码审查的中尉轮询,并对整个变更集进行集成测试,这在功能上相当于你在CVCS中可能称之为“功能分支”。这些看不见的分支都是可写的,中央回购(不是分支,单独回购)只能通过其设置方式读取;用户可以从它同步,但不能推送到它,除了中尉谁拉新的变化到它。基本上是稳定的,但每个人都可以完成工作。

难道你不能让每个人都同意不对集成分支进行更改吗?是的,当然这是一种选择,但我更多地考虑停止意外更改之类的事情。。。这意味着您可以进行更改,但提交将失败,除非您执行了
hg branch newbranch
。我认为您的评论更多地是关于Mercurial的,因此它的主题行听起来更像“如何在Mercurial DVCS中强制执行提交策略”bialix:注意并更改。我原本想在任何DVC中都可以这样做,但我是一个Mercurial用户,特别是:)对于共享hgrc,如果您只希望钩子应用于特定repo的克隆,您还可以在钩子中检查当前repo中初始提交的哈希/id。虽然这是一个很好的工作流(这是一个合理的问题解决方案),它没有制定技术规定(例如通过挂钩)完全过时。如果开发人员自己处于早期状态,即当他们提交或推送时,认识到他们破坏了工作流规则,那么代码副官不必处理意外破坏的规则,而是可以专注于更复杂的问题。我认为结合这些问题的一个好方法是使用代码挂钩