对于小型软件开发,我希望进行更改以遵循定义的过程,从而使集成分支仅包含“完整”更改。这个想法源自我的博客上的一篇关于从Mercurial获得useful history logs的文章。然而,这不仅仅是生成日志,而是关于一种结构化的工作方式。如何在Mercurial DVCS中执行提交策略
总之,这个想法是,一个存储库将有一个不会直接开发的“集成”分支,而是任何工作将在另一个分支上进行,并且当完成时将合并到集成分支中 - 下面是一个粗略的例子,带有大括号中的提交注释:
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时,这不是正确的工作流程方法吗?
难道你不能让每个人都同意不对集成分支进行更改吗? – 2011-06-16 12:34:42
是的,当然这是一种选择,但我更多地考虑阻止意外更改等事情......这意味着您可以进行更改,但是除非您完成了'hg branch newbranch',否则提交将失败。 – icabod 2011-06-16 13:35:04
我认为你的评论更多关于Mercurial,所以它的主题行听起来会更好,因为“如何在Mercurial DVCS中强制执行提交策略” – bialix 2011-06-16 19:12:27