我可以想象多个程序员如何在同一代码库中同时工作密集的系统。
我认为服务器上的版本控制系统应该能够在连接到代码库的程序员之一开始编辑时锁定一个文件进行编辑
关于代码库更改并将更新文件推送给其他人的实时通知(通过通知或自动更新)
在飞行中聊聊变更集,显示提交和差异(某些集成的源历史记录浏览器,如Trac有或类似也可以)
与某些特色IDE集成的解决方案(如Netbeans或Eclipse)
但是对于这个有什么便宜(完美的开源)解决方案呢? 您测试了哪些系统并可以推荐我使用?
编辑1:
建议的解决方案不必提供我写的所有功能。
该列表是我想象的系统列表,而不是需求列表。
问题更多的是如何解决“svn / cvs / etc上的多用户工作......”以及你最喜欢的解决方案。
编辑2号
一点点@thiton评论
指出存在称为RCS(版本控制系统)的东西是非常重要的。据我所知,RSC是CVS的祖先。 CVS作为一个概念在svn,git,mercurial,bazaar等中实现。
我们之所以从RSC转向其继任者,是因为旧的做事方式正在放缓并使团队工作过于复杂。锁定文件并在编辑完成后才释放它们,这不是我们想要的方式。
现在,我们可以在单个文件上反转更改(将其恢复为给定的修订版号),从而修复我们或其他故障,因此需要这样做。
所以我在列表中删除了第一点(注意它没有按降序优先顺序写下来),并且感谢@thiton提醒我。
答案 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工具包涵盖了您所询问的内容。此类工具包的示例:
除了所有提到的工具之外,我还建议在subversion存储库中使用以下存储库结构:
/project
/trunk
/tags
/builds
/PA
/A
/B
/releases
/AR
/BR
/RC
/ST
/branches
/experimental
/maintenance
/versions
/platforms
/releases
此repo结构主要关注版本控制的以下重要方面:
我提到了这个存储库结构,因为它存在这样的约定时会有很多帮助: