在 Mercurial 中,我如何将一堆提交与我们的错误跟踪器中的单个问题联系起来?

在 Mercurial 中,我如何将一堆提交与我们的错误跟踪器中的单个问题联系起来?

我们目前使用 svn,并且通过使用钩子,能够确保每个提交消息都以错误编号为前缀(将这些提交与我们的 Bugzilla 问题跟踪器中的问题报告联系起来。)

我们希望转向 mercurial,享受其分布式优势。但是 hg 的一个好处是开发人员不必在线提交更改,因此我们不希望钩子脚本根据我们的中央 Bugzilla 资源验证错误编号。

我可能从 svn 的角度考虑了太多,但我认为我希望开发人员能够在决定将他们的更改推送到中央测试存储库时指定错误编号。这里的关键要求是我们希望能够将提交与 Bugzilla 错误联系起来,但我们不想给开发人员一个复杂而手动的工作流程(例如,Attic 扩展似乎强加了这种工作流程)。

有任何想法吗?

答案1

要记住的重要一点是变更集(几乎)是不可变的,这意味着当开发人员运行时添加错误编号为时已晚hg push。 push 命令只会移动变更集,而不会更改它们。

不过,现在hg push当然是更新 Bugzilla 的好时机,因为开发人员在推送到中央存储库时是在线的。因此,您可以要求开发人员安装一个钩子,例如

[hooks]
pre-push.bugzilla = pick-bug-number.sh

pick-bug-number.sh脚本首先应检查开发人员是否正在推送到您的中央存储库(而不是,例如,推送到他们笔记本电脑上的其他存储库),然后要求他们提供错误编号。当开发人员输入错误编号时,脚本可以查看hg outgoing并将传出的变更集与 Bugzilla 中的错误关联起来。

这是将变更集与外部问题跟踪器关联的一种方式。变更集中不会有任何内容将其与 Bugzilla 错误联系起来 — 只有 Bugzilla 知道变更集属于哪些错误。

另一种方法是嵌入错误编号进入变更集本身。这可以通过命名分支在 Mercurial 中。让您的开发人员运行

$ hg branch bug-123

在开始处理错误编号 123 之前。以下提交将包含“bug-123”标签。推送到服务器时,可以轻松解析推送的变更集(在钩子中changegroup)并更新 Bugzilla。

您还可以要求开发人员将错误编号放入提交消息中,就像使用 Subversion 一样。不会有任何在线验证,但他们可以遵循与 Subversion 中几乎相同的工作流程。验证提交消息的最佳方法是配置ui.editor。使其成为一个自定义脚本,它将要求输入错误编号,将其放入提交消息模板中,然后启动编辑器让开发人员输入提交消息。

如果您计划有数千个错误编号,使用提交消息比使用命名分支更好。 Mercurial 本身可以很好地适应命名分支的数量,但许多工具希望能够在一个下拉菜单中显示所有分支。当您有 10 或 20 个分支时,这种方法很好,但当您有 5,000 个分支时,这种方法就失败了。这实际上更像是一个 UI 问题,但在您启动这个系统很久之后,它可能会给您带来麻烦。

答案2

例如,您可以在服务器端运行 cron 脚本,检查 mercurial 日志(使用 hg log),然后使用从日志中找到的问题编号更新 Bugzilla。例如,hg log 的参数 --date 2011-01-26 仅提供特定日期的日志消息,这比每次处理所有日志条目要快得多。

推送到服务器时无法添加消息,只能在提交时添加。

相关内容