对于小型软件开发,我希望更改遵循已定义的流程,其中集成分支将仅包含“完整”更改。这个想法源于我博客上关于从 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
我最初的想法是在( not precommit
or上添加一个钩子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 时工作流的正确方法吗?