处理版本控制系统上的多用户工作

时间:2011-07-18 13:50:59

标签: svn version-control ide cvs workgroup

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

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

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

  • 在飞行中聊聊变更集,显示提交和差异(某些集成的源历史记录浏览器,如Trac有或类似也可以)

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

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

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

编辑2号
一点点@thiton评论
指出存在称为RCS(版本控制系统)的东西是非常重要的。据我所知,RSC是CVS的祖先。 CVS作为一个概念在svn,git,mercurial,bazaar等中实现。
我们之所以从RSC转向其继任者,是因为旧的做事方式正在放缓并使团队工作过于复杂。锁定文件并在编辑完成后才释放它们,这不是我们想要的方式。 现在,我们可以在单个文件上反转更改(将其恢复为给定的修订版号),从而修复我们或其他故障,因此需要这样做。
所以我在列表中删除了第一点(注意它没有按降序优先顺序写下来),并且感谢@thiton提醒我。

4 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:1)

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

否则,如果您希望在准备好时手动提取其他人的更改,全部您在编辑2中列出的VCS将执行电子邮件通知(您需要自己编写一个钩子脚本,在大多数情况下),大多数都有图形界面做差异和什么不。

您没有提供足够的信息来决定推荐哪个。你必须决定你是想要集中还是分发,然后超越它只是一个品味的问题。我不知道有任何集成的聊天工具,但是,嘿,设置IRC服务器并不难,或者只是在freenode上创建一个房间(如果你没有做任何保密的话)。

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

其他VCS也可用。

答案 2 :(得分:1)

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

我的偏好是尝试将每个即将推出的功能保存在一个单独的功能分支中(几乎无论多小)。然后,为此功能分配的人员只能进行自己的更改;没有干扰来自其他开发者。

错误修复(除了真正微不足道的修补程序)也首先作为单独的分支进行,只是为了保持干线稳定和干净。最新的主干修订始终对应于产品的最后交付版本(发布)。

当准备新版本时,如果只有一个更改,并且该更改本身基于先前提供的版本,则可以针对分支版本运行测试,并且在新版本发布时,来自分支的更改只是简单地集成到主干版本中。诸如cvs和svn之类的版本控制系统对这种类型的合并操作有很好的支持(我自己没有使用过git,但是也明白分支和合并在那里处理得很好。)

如果要集成多个不同的更改,我更愿意创建一个单独的“集成”分支,我首先逐一收集要集成的所有更改。同样,版本控制系统在存在冲突编辑时进行标记(即,单个代码文件的一个位置中的两个不同的变化)。他们可以理解的是,是否存在由几个不同变化引起的功能冲突。因此,在每次整合后,至少需要进行一些疏忽,并且需要进行更好的测试。

然后,当所有单个更改都已集成到集成分支时,可以对其进行全面测试,并在准备发布时再次合并到主干。如果有进一步的更正,可以在原始功能分支中进一步开发,然后将更正集成到集成分支。

这种方式非常适合快速修正错误,因为主干始终包含最后一个版本。它也非常适合投机开发,因为独特的功能分支仅在集成时影响干线。此外,功能可以在多个发布周期中工作,因为版本不会影响功能分支中的持续开发。这样,“总线因素”(如果其中一个开发人员被总线运行会发生什么)也会减少;可以在功能分支中检查不完整甚至无法编译的代码 - 如果出于任何原因有人在工作中丢失,则所有已完成的工作都可供其他开发人员使用。此外,工作站灾难不会引起重大担忧,因为如果工作站可以轻松地保存一周未完成的开发工作,而不是备份。

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

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

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

答案 3 :(得分:1)

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

  1. Atlassian产品 Jira (问题跟踪), Fisheye (差异查看器/存储库查看器), Crucible (代码审核工具)和其他人(Confluence,Bamboo,Clover)。这是一堆工具,我建议任何人面对你所描述的问题。我想我不应该涵盖 Jira 的功能,只要它可能是最受欢迎的问题跟踪系统。可以使用Subversion-Jira plugin将问题跟踪与版本控制集成。安装和配置此插件后,可以在提交注释中提及问题编号(#234,#687等)。然后Jira将显示特定问题下的所有提交,因为此提交已导致该问题。如果您想查看这些提交的内容,则需要 Fisheye 。它不仅允许您查看,还可以评论更改并以链接的形式放置更改集。如果您有鱼眼,那么引用变更集或提交就没有问题。另一个级别的合作是 Crucible 。它允许对其他用户执行的版本控制系统中的所有提交执行代码审查。它非常灵活。例如,您可以在特定提交中的特定源代码行前面添加注释,动态创建子任务并将您自己的代码放入审阅注释中。驴工具是金钱可以买的最好的工具,恕我直言。你可能会看到,他们不是免费的。 这就是你可能不喜欢它的原因。不过还有其他选择。
  2. ViewVC - 存储库浏览/差异查看器工具。可以认为是鱼眼更换。
  3. WebSVN - 另一个存储库浏览/差异查看器工具。
  4. Commit Monitor。并不总是希望通过电子邮件通知您。在这种情况下,提交监视器(在Windows下运行)可能会派上用场。当有人提交时,它会在桌面上显示弹出窗口。从我的角度来看,它比获取电子邮件更方便。此外,您可以直接在Commit Monitor中查看上次提交的列表。如果您无法在Windows上运行,请使用WineSubversion Commit Monitor
  5. 使用changelists 。 subversion和TortoiseSVN have changelist功能(它与变更集不同),它经常派上用场。您需要了解的是,更改列表与问题的概念类似,但在版本控制级别上。
  6. 除了所有提到的工具之外,我还建议在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等。
    8. 我提到了这个存储库结构,因为它存在这样的约定时会有很多帮助:

      1. 通信即可。您不需要在提交日志中写很多内容来描述您正在做的事情 - 您只需将相应的工件添加到VCS中。
      2. 做出错误行动的机会降低。很多时候开发人员迫切需要做一些事情,但不知道如何做到这一点。这就是容易做出错误举动的情况,因此提高了与他人沟通和互动的必要性。当这些常见动作(在VCS方面)的列表不存在于wiki的某个地方(人们应该尝试查找)时,它会有很多帮助,但是就在存储库中。
      3. 少提问题。在大多数情况下,在存储库中具有这样的结构是不言自明的。如果对如何在VCS中执行某些操作的问题较少,那就更好了。
相关问题