3

我可以想象多个程序员如何同时在同一个代码库上密集工作的系统。

  • 我认为当连接到代码库的程序员之一开始编辑它时,服务器上的版本控制系统应该能够锁定一个文件进行编辑

  • 关于代码库更改的实时通知并将更新的文件推送给其他人(通过通知或自动更新)

  • 即时讨论变更集,显示提交和差异(一些集成的源历史浏览器,如 Trac 或类似的也可以)

  • 与某些特色 IDE(如 Netbeans 或 Eclipse)集成的解决方案

但是有什么便宜的(完美的开源)解决方案呢?
您测试过哪些系统并且可以推荐我使用?

编辑 1:
建议的解决方案不必提供我写的所有功能。该列表是我想象的该系统可能具有的列表,而不是需求列表。问题更多的是关于如何解决“svn/cvs/etc 上的多用户工作”以及您最喜欢什么解决方案。

编辑 no.2
围绕@thiton 评论
的一点点 指出存在称为 RCS(修订控制系统)的东西是非常重要的。据我所知,RSC 是 CVS 的祖先。CVS 作为一个概念在 svn、git、mercurial、bazaar 等中实现......
我们从 RSC 转移到其继任者的原因是,旧的做事方式正在减慢和过度复杂的团队工作。锁定文件并仅在编辑结束后释放它们,这不是我们想要的方式。现在,由于我们可以撤销对单个文件的更改(将其恢复为给定的修订号)并修复我们或其他人的错误,因此需要这样做。
所以我删除了我列表中的第一点(注意它不是按优先级降序写的),感谢@thiton 提醒我。

4

4 回答 4

1

你可以用 Subversion (svn) 做你想做的事。我喜欢实时通知的是每次提交后发送的一封电子邮件,其中包含更改的差异。起初这看起来很奇怪,但一旦你习惯了它,如果它不可用,你就会错过它。

每个开发人员都有电子邮件并且知道如何处理它。如果您不想被打扰,您只需关闭您的邮件客户端。它适用于所有工具,因为它在服务器上运行。您可以找到有关此问题的教程。

如果一位开发人员正在编辑文件,我不会锁定文件。在这种情况下,所有其他开发人员都无法进行更改,并且每个人都变慢了。如果您的业务逻辑有很长的帮助程序类,这种情况会很快发生。

并且不要自动更新工作副本。如果您正在构建项目或更改文件,则很容易导致冲突。在最好的情况下,您只需要重新构建它,但在最坏的情况下,您会丢失自上次提交以来的所有数据。

如果您更喜欢分布式版本控制系统,也可以使用 git 和 mercurial 来完成钩子脚本方法。在这种情况下,钩子在您选择为主的存储库上运行。

于 2011-12-30T18:07:16.673 回答
1

如果您真的希望在其他人提交更改时在您的工作树中进行实时更新,那么您需要类似 ClearCase 的东西,但这绝对不便宜(我和我认识的大多数人都讨厌它)。

否则,如果您希望在准备好后手动拉取其他人的更改,那么您在编辑 2 中列出的所有VCS 都会发送电子邮件通知(在大多数情况下,您需要自己编写一个钩子脚本),并且大多数都有图形做差异和什么的接口。

您没有提供足够的信息来决定推荐哪个。您必须决定是要集中式还是分布式,除此之外,这实际上只是个人喜好问题。我不知道有任何集成的聊天设施,但是嘿,设置 IRC 服务器并不难,或者只是在 freenode 上创建一个房间(如果你不做任何保密的事情)。

SVN、Git 和 Bazaar 都是不错的选择。我没有使用过 Mercurial,但我听说过它的好消息。Arch 可以,但我不喜欢它。CVS 可以工作,但是带有变更集的东西会让历史更容易理解(很多)。

其他 VCS 也可用。

于 2011-12-30T19:44:27.007 回答
1

关于版本控制系统的使用有多种思想流派。

我的偏好是尝试让每个即将推出的功能都在单独的功能分支中工作(无论多么小)。分配给此功能的人员只有他们自己的更改要处理;没有来自其他开发商的干扰。

错误修复(除了真正琐碎的)也作为单独的分支首先进入,只是为了保持主干线稳定和清洁。最新的主干修订版始终对应于产品的最后交付版本(发行版)。

在准备新版本时,如果只有一个更改即将到来,并且该更改本身基于先前交付的版本,则可以针对分支版本运行测试,并且在新版本发布时,从分支被简单地集成到主干版本中。cvs 和 svn 等版本控制系统对这种合并操作有很好的支持(我自己没有使用过 git,但知道分支和合并也可以很好地处理)。

如果有几个不同的变化需要集成,我更喜欢创建一个单独的“集成”分支,我首先将所有需要集成的更改一个一个收集到该分支。同样,版本控制系统会在存在冲突编辑时进行标记(即在单个代码文件的一个位置进行两次不同的更改)。可以理解的是,他们无法判断是否存在由几个不同的更改引起的功能冲突。因此,在每次集成之后,至少需要进行一些监督,并且还需要进行测试。

然后,当所有单独的更改都集成到集成分支时,可以对其进行彻底测试,并在准备发布时再次合并到主干。如果有进一步的修正,可以在原有的特征分支中进一步发展,然后将修正整合到整合分支中。

这种方式非常适合快速的错误纠正响应,因为主干总是包含最后一个版本。它也非常适合投机开发,因为独特的功能分支仅在集成时才会影响主干线。此外,功能可以在多个发布周期内工作,因为发布不会影响功能分支中正在进行的开发。这样,“总线因素”(如果其中一个开发人员被总线碾过会发生什么)也减少了;可以在功能分支中签入不完整甚至无法编译的代码——如果由于任何原因有人缺勤,所有已完成的工作都可供其他开发人员使用。此外,工作站灾难不会引起严重的担忧,如果工作站可以轻松地保存一周的开发工作,但没有签入,没有备份。

是否在发布新版本时始终将长期存在的功能分支更新到最新版本是一个政策问题,也可能取决于上一个版本中的内容。另一个政策问题是集成部门的所有权;是否有某个人负责收集所有功能分支更改并进行所需的小更改以使其与其他更改相适应,或者每个功能开发人员/团队是否将负责将更改从该特定功能分支获取到集成分支。我赞成单独的“发布构建器”(当然,他通常是功能开发人员之一)。

至少在我的现实中,3-4 名开发人员似乎可以在一个分支中很好地工作,如果他们以其他方式相互交流(共享办公空间是首选方式)。他们确实自己组织工作,并且可以避免踩到对方的脚趾。此外,单独的功能分支似乎很少相互接触相同的文件,因此大多数合并周期都相当轻松(可以通过更改描述来预测痛苦的)。另一方面,即使是单个开发人员在多个不同但同时进行的更改任务上进行多任务处理,如果更改没有在分支中隔离,最终也会遇到麻烦。

所以,总结一下:不要锁定文件,而是要有一个好的版本控制系统,勇敢地利用分支,合并分支的变化时要睁大眼睛。

于 2011-12-30T21:11:01.880 回答
1

应用程序生命周期管理 (ALM) 和大量 ALM 工具包涵盖了您所询问的内容。此类工具包的示例:

  1. Atlassian 产品Jira(问题跟踪)、Fisheye(差异查看器/存储库查看器)、Crucible(代码审查工具)和其他(Confluence、Bamboo、Clover)。这是一堆工具,我会推荐任何面临您描述的问题的人。我认为我不应该介绍Jira所做的事情,只要它可能是最流行的问题跟踪系统即可。可以使用Subversion-Jira 插件将问题跟踪与版本控制集成. 安装和配置此插件后,允许在提交评论中提及问题编号(#234、#687 等)。Jira 然后将显示特定问题下的所有提交,因为这些提交对问题有贡献。如果您想查看这些提交的内容,您将需要Fisheye。它不仅允许您查看,还可以评论更改并以链接的形式放置更改集。如果您有 Fisheye,那么引用变更集或提交将没有问题。另一个级别的协作是Crucible. 它允许对您在其他用户执行的版本控制系统中的所有提交执行代码审查。它非常灵活。例如,您可以在特定提交中的特定源代码行前面添加评论,即时创建子任务并将您自己的代码放入评论评论中。Atlassian 工具是钱能买到的最好的工具,恕我直言。如您所见,它们不是免费的。这就是为什么你可能不喜欢它。不过,还有其他选择。
  2. ViewVC -存储库浏览/差异查看器工具。可以考虑更换鱼眼。
  3. WebSVN - 另一个存储库浏览/差异查看器工具。
  4. 提交监视器。并非总是希望通过电子邮件收到通知。在这种情况下,提交监视器(在 Windows 下运行)可能会派上用场。当有人提交时,它会在桌面上显示弹出窗口。从我的角度来看,它比接收电子邮件更方便。此外,您可以直接在 Commit Monitor 中查看上次提交的列表。如果您无法在 Windows 上运行,请使用WineSubversion Commit Monitor
  5. 使用变更列表。subversion 和TortoiseSVN 都具有 changelist功能(它与 changeset 不同),并且经常派上用场。您需要知道的只是变更列表类似于问题的概念,但在版本控制级别上。

除了所有提到的工具之外,我建议使用以下存储库结构作为 subversion 存储库:

    /project
        /trunk
        /tags
            /builds
                /PA
                /A
                /B
            /releases
                /AR
                /BR
                /RC
                /ST
        /branches
            /experimental
            /maintenance
                /versions
                /platforms
            /releases

这个 repo 结构专注于版本控制的以下重要方面:

  1. 使用分支
  2. 永远知道为什么需要分支机构
  3. 使用标签
  4. 永远知道为什么需要标签:)
  5. 使用 svn:externals。这意味着您应该尝试模块化您的应用程序并考虑模块之间的依赖关系。
  6. 使用“每个项目的存储库”方法。它将有助于模块化您的应用程序并避免频繁的错误。
  7. 使用持续集成。它将有助于跟踪您在存储库中拥有的分支的当前状态。实际上,可以认为持续集成对协作活动和团队沟通产生巨大影响。如果您之前没有使用过持续集成并且不知道从哪里开始,那么有很多选择:CruiseControl(也是 CruiseControl.NET 和 CruiseControl.rb)、Hudson、Jenkins、Bamboo、TeamCity、Continuum 等。

我提到了这个存储库结构,因为当存在这样的约定时它会很有帮助:

  1. 沟通。你不需要在提交日志中写很多来描述你在做什么——你只需将相应的工件添加到 VCS 中。
  2. 做出错误举动的机会更低。很多时候,开发人员迫切需要做一些事情,但不知道具体该怎么做。在这种情况下,很容易走错路,因此提高了与他人沟通和互动的必要性。当此类常见动作的列表(就 VCS 而言)不在 wiki 上的某个地方(应该尝试找到的地方),而是立即在存储库中时,它会很有帮助。
  3. 少问。在大多数情况下,在存储库中具有这样的结构是不言自明的。当关于如何在 VCS 中做某事的问题较少时会更好。
于 2011-12-31T12:00:24.087 回答