缺陷跟踪器/版本控制集成如何与典型的Git工作流程配合使用?

15
以下是git工作流程的示例: 假设您想利用缺陷跟踪器与版本控制系统集成。那么该如何将其融入这些工作流程中?在跟踪器中会看到什么?
我是BugTracker.NET的作者,就像许多其他缺陷跟踪器(如Trac、Redmine、FogBugz)一样,我们更多地使用svn进行集成。但是对于git,我很难想象与git集成会是什么样子。
编辑:我查看了一个尝试将 github-fogbugz 集成到一起的项目,但即使该项目的作者也表示“显然FogBugz是为更传统的CVS/SVN SCM系统编写的。因此,提交列表显示与git不太一致。”
编辑2:有关Redmine/git工作流的讨论: 似乎最典型的设置是Redmine与被认为是“中央”存储库的本地克隆一起使用,这样当它们到达此克隆时,就会看到更改。触发器或定期工作自动将更改推送到Redmine的克隆。

编辑3: 看起来即使在Linux和Linus的情况下,最终也存在一个可以被视为「慈善独裁者仓库」的主Git仓库:请参见http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=summary

结语: 非常感谢大家。根据你们提供的指导,我的BugTracker.NET现在包括了Git集成。


非常抱歉工具混淆了(我以为我可以在晚上晚些时候写答案...我错了!)。我已经修改了我的答案,反映了BugTracker.NET这一次。然后您应该能够删除您的第一个评论。我还用一些额外的要点完成了我的答案。 - VonC
@Vonc - 再次感谢您为回答付出了如此多的努力。这让我感到有些内疚,因为我不同意它。我已经转向@MichaelM的想法,即“它看起来与Subversion支持几乎完全相同。缺陷跟踪器遵循一个仓库作为至高无上的仓库”。 - Corey Trager
7个回答

8
Trac和Redmine都支持与Git集成。它看起来与Subversion支持几乎完全相同。缺陷跟踪器将一个存储库作为"慈善独裁者"存储库,它不必关心周围的所有其他克隆版本。
我认为值得一提的是,任何缺陷跟踪器都需要正确支持git分支。在Git方法论中,工作在分支上是如此重要,因此需要在缺陷跟踪器中进行支持。 Redmine可以通过补丁来实现这一点,但是最近我看了一眼(大约一个月前),它并没有在主源树中(您只能遵循主干)。
其他有用的功能是图形化表示分支如何创建和合并,类似于gitk的外观。我不知道有哪个缺陷跟踪器会进行这种可视化。
由Corey Trager编辑。我将@Squelch的答案复制/粘贴到这里(我也投票给了@Squelch):
由于Git的分布式性质与SVN的集中性质相对应,每个用户或存储库副本都可能具有不同的分支。现有的跟踪器通常具有存储库的本地副本,该副本用作可视为所有用户的工作副本的中央参考("慈善独裁者")。
用户在其本地副本中可能具有与跟踪器不同的分支结构。他们可能选择保留一些私有内容,仅拉取他们感兴趣的远程分支,或将新分支推送到远程(跟踪器)。用户甚至可以在彼此之间共享跟踪器可能永远不会看到的分支。
缺陷跟踪器实际上只能引用它可以访问的存储库。通常这是跟踪器的本地副本,但从远程存储库进行拉取也是可能的,并且更难管理。如果它正在访问远程,则只能跟踪它了解的分支,并且除了计划任务外没有真正启动此任务的方法。这还假定用户也在提供其本地副本。
如您已经注意到的那样,可以使用计划任务或事件挂钩使用提交日志更新跟踪器的详细信息。然后可以根据需要将这些详细信息与跟踪器问题匹配并记录如上。
简而言之,跟踪器通常会看到它当前可以访问的分支所做的任何更改。使用挂钩,包括创建新分支在内的这些更改会立即显示。它将不会看到或跟踪对用户(离线)存储库所做的更改,直到他们推送这些更改为止。

从遵循一个仁慈的独裁者存储库的想法中可以得出,集成发生的步骤似乎不是当开发人员将其检入本地分支时,而是当本地分支推送到ben dict存储库时。对于错误跟踪器来说,对本地分支的检入是不可见的。我的理解正确吗? - Corey Trager
是的,这就是它的工作方式。对于 bug 跟踪器来说,了解所有本地提交和分支是不可能的。由于它们都是本地的,我很可能在我的笔记本电脑上使用一个分支,但它从未被推送到任何地方。世界其他地方的人不需要看到这个。正确的分支支持是最重要的事情,因为在 Git 中有几个活动分支是非常常见的工作流程。 - MichaelM
当你说“几个活跃的分支”时,你是指中央/仁慈独裁者克隆内的分支,对吗?这条评论的其余部分是一个离题。关于“这是不可能的……”,我在想,“真的吗?”我可以想象检查本地分支会触发一个脚本,通过HTTP向中央缺陷跟踪器发送消息。如果编码人员在断开与互联网的连接时进行了签入,则可以将消息排队,直到编码人员重新连接到互联网的时间。 - Corey Trager
是的,抱歉,我的换行符已被删除。在“仁慈的独裁者”存储库上活跃的分支通常有几个,错误跟踪器肯定要跟踪。至于跟踪私有/本地分支(我之前的笔记本电脑),我不确定这是否与只推送到主存储库中的分支没有什么区别。或者,如果您想保持存储库分开,可以使用post-commit挂钩来实现您所描述的内容。 - MichaelM
这是我们为我们的问题跟踪器DoneDone实现git集成的方式 - 您在将推送推送到主分支时发送HTTP POST,它会更新提交消息中提到的问题。推送者必须存在于DoneDone项目中,以便将更新与该用户绑定。我认为在DD中为每个分支设置多个项目是最简单的解决方案,但您可以设置一个脚本,以便在推送到git时使用tag修改提交消息,用一种您认为合理的方式组织您的问题。 - Mustafakidd

8

很好的问题。
要回答它,你需要看看这两个工具(BugTracker.NET,显然你很熟悉它;) 和 Git,最初是为 Linux 开发的)实际上试图解决什么问题。

  • BugTracker.NET:基于 Web 的跟踪器,用于跟踪错误(或几乎任何其他您想要跟踪的“项目”,因为您可以定义自定义字段、状态和工作流程)
  • Git:本质上是一个补丁集成器,旨在快速应用来自许多人(其中并非所有人都知道或具有特定角色)的大量补丁到大量文件中。

因此,您可以看到这里的不协调之处,在于中央参考和分布式代码聚合工具之间。

这两种模型之间的最低公共分母仍然是“仁慈的独裁者工作流”,这是目前最分散的工作流,但仍有一个中央存储库供您监视。

但是,如果你遵循这条路径(监控一个仓库作为“官方参考”,同时在该仓库下具有松散的分布式合并工作流),那么你需要重新定义用户及其角色。特别是当涉及将Git与你的集中式基于角色的缺陷跟踪工具集成时。
如果你观看Linus在Google上关于Git的演讲,大约在18'35处,你会发现使用Git意味着不需要将所有用户标识和附加到角色。
以下是一些快速引用/要点,说明了这个事实:
“因为你有一个中央仓库,意味着每个在该项目上工作的人都需要写入中央仓库。这意味着,由于你不希望每个人都写入中央仓库,因为大多数人都是白痴,所以你创建了这个看似不是白痴的人类。”
因此,并不是每个人最终都会推送到中央仓库,而且大部分实际工作(小修复、验证、测试等)都将由有限数量的人完成。
"That 'Benevolent dictator workflow' means that you work with a 'network of trust': a selected group of people. Not all developers are directly visible.
From the same presentation, you also realize that an 'all repository' can be part of the code's lifecycle (as opposed to branches such as 'integration', 'testing', 'to be released', or labels such as 'release1.0'):
'One of the things for commercial companies: the distributed model also helps with the release process. You can have a verification team that has its own tree. They pull from people and verify it. Once they have verified their version, they can push it to the release team and say "Hey. We have now verified our version." The development team can continue working without having to create tags, branches, or any other measures to avoid stepping on each other's toes. Each group can have its own tree and track its work and what they want done.'"
那就强调了之前的观点:如果你只监控一个仓库,你只能监控有限数量人的提交。
并且它增加了一个曲折:
虽然你不能监控所有的仓库,但你可能不想只监控一个仓库:如果错误跟踪涵盖了几个阶段(即“连续集成”,“功能测试”,“用户验证”,“预生产”等),每个阶段都有可能拥有自己的代码树,并且每个阶段都可能是填写错误报告的潜在来源。
在这方面,“Redmine的Git分支支持”(修订版2840)仍然采用“集中式仓库”的思路,其中使用分支进行开发生命周期建模(你在做与开发相关的任务,而不是实际的“开发工作”,这才是分支应该关注的)。

那么,这一切对你意味着什么?

  • 要么采用严格的中央仓库模型(每个人都必须推送到一个仓库),但在我看来,当一个工具试图强制你按照某种方式工作而不是让你根据自己的方式来适应工具时,这种模型从未好过。

  • 要么重新定义缺陷生命周期管理以考虑以下因素:

    • 可能存在多个树,每个树都是解决缺陷的潜在步骤。
    • 用户将被注册为正在处理缺陷,但没有完整的代码历史记录:即监控的代码可能与他们没有直接关联,因为解决方案可以在开发人员的仓库的私有分支上完成,而监控的代码是由专门仓库上的一个“集成者”进行多次合并而成的。
    • 智能报告能够告诉您哪些缺陷在代码的“官方修订版”中被检测/修复,限制自己指出这些更改的来源(它来自这些远程分支的合并,对于这些远程仓库)。

简而言之,这不是一项简单的任务。

问题仍然存在:

Git发布工作流程,既可以是跨库的(push/pull),也可以是同一库内的合并/变基(merge/rebase):您想要跟踪哪些内容?
Git私有分支:不应跟踪代码的所有历史记录,只应跟踪公共分支(这些分支被拉取/推送,但也通过某些合并或变基在其自己的存储库中进行修改)。
Git用户:根据他们在“信任网络”中的位置,他们具有不同的角色,跟踪器需要反映这些角色。

感谢您在回答中付出了这么多。我不得不学习更多,思考更多,现在我在这里:仁慈的独裁者风格反映了几乎所有人都在使用的git。即使是Linus。请参见http://www.kernel.org/和http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=summary。 - Corey Trager

5
为了回应MichaelM的答案,Redmine具有良好的Git集成。它遵循提交消息中的关键词,如引用、修复等和形式为#1234的跟踪器号码。
虽然分支支持还不是很完善,但它已经在一个月前进入了主干about a month ago,并且注定要成为0.9版本。Redmine目前在SVN中维护,但也有Github上的镜像
与如何导航分支有所不同,Redmine主干的链接显示了Git存储库的跟踪器输出。
$ git log

可以用于解析提交消息、作者和修订版本,以便在需要时在任何跟踪器中使用。
编辑:由于 Git 的分布式特性与 SVN 的集中式特性相对应,每个用户或存储库的副本都有可能具有不同的分支。现有的跟踪器通常具有存储库的本地副本,该副本用作所有用户的工作副本的中央参考(“仁慈的独裁者”)。
用户的本地副本中的分支结构可能与跟踪器中的不同。他们可能选择保留一些私有内容,仅拉取他们感兴趣的远程分支,或将新分支推送到远程(跟踪器)。用户甚至可以在彼此之间共享分支,而远程可能永远不会看到这些分支。
错误跟踪器实际上只能引用它具有访问权限的存储库。通常这是跟踪器本地的,但也可以从跟踪器远程拉取,并且更难管理。如果它正在访问远程,则只能跟踪它了解的分支,并且除了计划任务外,没有真正启动此任务的方法。这还假定用户也正在提供其本地副本。
如您所见,可以使用计划任务或事件钩子来使用提交日志更新跟踪器以获取详细信息。然后,可以将这些详细信息与跟踪器问题匹配以根据需要查看并如上所述进行记录。
简而言之,跟踪器通常会看到其当前可以访问的分支上所做的任何更改。使用钩子,这些更改立即可见,包括新分支的创建。它不会看到或跟踪用户(离线)存储库中所做的更改,直到他们推送这些更改。

谢谢。我理解分支支持与Redmine的存储库查看功能有关,但我认为这与我的问题有点不同。我想问的是,当我作为程序员修复错误时,通过检入、推送等步骤与git交互,在工作流程的哪个或哪些点上记录我的活动到缺陷跟踪器中。到目前为止,听起来好像是在将最终推送提交到“中央”存储库时记录的。对吗? - Corey Trager
我无法留下评论,因此包含了有关Redmine对更改的看法的相关信息。我注意到您关于计划和触发更新使用的编辑,这是我在回答中省略的。我已经更新了我的回答,涉及了一些更多的git分支方法。 - Squelch
我点赞并复制/粘贴了你的很多文本到被接受的答案中。 - Corey Trager

1

当然,在 GitHub 上还有一个与 Fogbugz 的 开源集成


谢谢。这很有用。但是,作者本人写道,“很明显FogBugz是为更传统的CVS / SVN SCM系统而编写的。因此,提交列表显示与git不太相符。” - Corey Trager

1

看看Launchpad是如何做到这一点的:在不同的位置跟踪错误状态。

下面我将引用Mark Shuttleworth的话:

真正的分布式缺陷跟踪(其中缺陷列表随处可见)非常令人兴奋,可能是长期解决方案。在此期间,您可以通过在几个不同的地方跟踪缺陷状态来解决它。Canonical一直在资助Bugzilla、Trac和其他缺陷跟踪器的工作,以使我们能够以编程方式更轻松地与它们交流,从而可以自动更新Ubuntu开发人员的状态。
我们在Launchpad中有一个“分布式缺陷状态的集中视图”,它帮助我们跟踪问题在上游、Debian或其他发行版中的状态。例如,请查看以下缺陷: https://bugs.launchpad.net/moblin-applets/+bug/209870 https://bugs.launchpad.net/ubuntu/+source/nfs-utils/+bug/214041 https://bugs.launchpad.net/ubuntu/+source/tuxmath/+bug/220319 https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.22/+bug/123920 https://bugs.launchpad.net/ubuntu/+source/warsow/+bug/131582 在每种情况下,您都可以看到该缺陷如何与其他缺陷跟踪器中的报告相关联,然后状态会自动更新。作为一个小小的结果,您可以通过LP订阅任何支持类型的缺陷跟踪器上的任何缺陷报告。
集中视图不是最终解决方案,但它对我们和其他许多项目(上游和发行版)都有效。

0

Redmine已经与Git集成,并且是开源的。也许你可以查看他们的集成以获取一些想法。


0

也许我有点天真,但是在git中进行错误跟踪与svn有很大的不同吗?系统使用的存储库基本上具有与subversion相同的结构(分支和标签),对吧?

我可以想象你可能想要一个漂亮的图形表示分支之间的交互,但除此之外...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接