【发布时间】:2009-01-06 18:19:01
【问题描述】:
我从 SVN 开始。我知道基本命令并了解基本原理。我想知道是否有人对在团队环境中使用 Subversion 有任何提示或最佳实践。
我可以看到在提交代码时添加相当详细的消息的好处,但我还应该记住其他一些事情吗?
感谢所有出色的答案 - 他们帮了很多忙。
【问题讨论】:
标签: svn
我从 SVN 开始。我知道基本命令并了解基本原理。我想知道是否有人对在团队环境中使用 Subversion 有任何提示或最佳实践。
我可以看到在提交代码时添加相当详细的消息的好处,但我还应该记住其他一些事情吗?
感谢所有出色的答案 - 他们帮了很多忙。
【问题讨论】:
标签: svn
鼓励频繁提交。 刚接触版本控制的队友可能会觉得他们需要将代码保留在存储库之外,直到“它可以正常工作”为止。教导每个人尽早承诺并经常尽快发现问题。建议您的队友为可能破坏主干的功能创建分支,而不是保留代码直到它工作。这导致...
建立分支和标记实践。 除了功能分支之外,鼓励您的队友使用分支修复大错误。在工作开始和结束时标记主要错误修复。维护生产/质量保证版本的标签(可能还有分支)。
为trunk 制定政策并坚持下去。 一个例子可能是“trunk 必须始终无错误地构建”。或“主干必须始终通过所有单元测试”。任何还不能达到trunk标准的工作都必须在分支中完成。
【讨论】:
不要通过代码更改提交格式更改
如果你想重组一个大文件的空白(Control+K+D),没问题。将格式更改与实际的逻辑更改分开提交。如果您想在文件中移动函数,也是如此。将移动与实际编辑分开提交。
【讨论】:
我一直坚持的一个关键概念是一起提交相关的代码更改。推论是不要在同一个提交中提交不相关的代码更改。这意味着不要在一次提交中修复 2 个错误(除非它是相同的修复),并且不要在 2 次提交中的每个提交中提交一半的错误修复。此外,如果我需要向系统的不相关部分添加一些新的增强功能或某些东西,然后我需要进行其他工作,我会单独(并且首先)提交增强功能。这个想法是,任何人可能想自己拥有(或自己回滚)的任何更改都应该是一个单独的提交。当需要进行合并或回滚损坏的功能时,它将为您省去很多麻烦。
【讨论】:
已经提到了很多,这里还有一些:
如果您有不需要在源代码管理中的文件(例如配置、编译文件等),请将它们添加到 忽略列表。通过这种方式,您会注意到任何忘记添加的文件,因为您总是期望一个空的文件列表显示为 SVN 未知。
添加一个提交后事件,该事件将向您的开发者邮件列表发送一封电子邮件(或一个特定于该目标的邮件),该事件与已提交的更改以及理想情况下的补丁相关。
与您的错误跟踪器集成,以便对提交的引用显示在错误/功能请求中,并带有指向差异的链接。像 MantisBT 这样的错误跟踪器支持这一点。
考虑与持续集成集成(例如CruiseControl.NET),NAnt 用于构建,NUnit/VS 用于单元测试。这样,一旦用户签入代码或在预定的时间间隔内代码被编译,单元测试就会运行,并且开发人员会获得该过程的反馈。如果存储库损坏(即未构建),这也会提醒团队的其他成员。
【讨论】:
好吧,基础知识:
【讨论】:
人们给出的答案很棒。大部分内容在 best practices for SVN 的 svn 用户文档中进行了总结。
重复:
【讨论】:
我想总结一下我坚持的最佳做法:
应该有存储库结构。我个人使用以下存储库结构:
/trunk
/tags
/builds
/PA
/A
/B
/releases
/AR
/BR
/RC
/ST
/branches
/experimental
/maintenance
/versions
/platforms
/releases
PA(pre-alpha)、A(alpha)、B(beta)、AR(alpha-release)、@987654327 @(测试版)、RC(候选版本)、ST(稳定版)。您可以通过diagram 的形式找到我的颠覆最佳实践大纲,说明我使用的软件配置管理方法的主要原则。
【讨论】:
我发现非常有用的一件事是svn:external 属性,这意味着您可以将其他存储库中的目录引用到您自己的存储库中。它提供了非常好的组织代码和数据的方法。一些例子是:
【讨论】:
使用与您的错误跟踪软件的集成。如果您使用Bugzilla,您可以进行设置,如果您的评论以“Bug XXXX”开头,您的 SVN 评论会自动添加为给定错误的评论,包括指向该修订版的 SVN Web 界面的链接。
【讨论】:
了解 SVN 的分支和合并工具和约定。
与其他团队成员合作的最佳方式是将工作分解为完整的开发功能/修复,然后在一个分支中进行单独的更改。然后在完成/准备好/批准合并时将更改合并回主线分支/主干。
这样,个人可以朝着一个共同的目标(在同一个分支或不同的分支)工作,而不会与其他更改发生冲突。
您的里程可能会有所不同,这对于两个左右的人来说可能有点过头了。
【讨论】:
如果您使用与 SVN 良好集成的好工具,它会变得更加容易。这些使您可以轻松查看已更改的内容,然后提交全部或部分更改,并经常将您的工作副本更新到 SVN 中的最新版本。
我推荐Tortoise SVN(如果您使用Windows)和Visual SVN(如果您使用VS)。
还可以查看您是否可以设置它,以便在提交更改时收到电子邮件或类似通知(通常还包括提交消息和更改文件的列表)。像CVSDude 这样的服务提供了这个。我发现在更新我的工作副本之前了解已经进行了更新以及了解该更新中包含的内容是很有帮助的。
【讨论】:
除了分支策略等。 (一种尺寸绝对不能满足所有人的需求),你应该有好的提交:
【讨论】:
源代码控制的黄金法则:尽早签入,经常签入
有关如何组织存储库的提示:
【讨论】:
在修复任何合并冲突之前,请与您的团队协商他们的更改,或者至少非常仔细地查看差异。请他们自己检查合并后的代码,以确保他们的添加不会在合并中丢失。
【讨论】:
我已经看到减少提交中断的一件事是拥有良好的预提交脚本。例如,您可以在提交更改之前运行任何单元测试。这会导致提交速度有点慢,但您可以通过避免踩到别人的脚趾而不得不道歉来节省时间。当然,当您拥有庞大的开发团队和非常频繁的提交时,这将变得更加难以管理。
【讨论】:
与 bug-tracker 集成和执行提交策略的示例之一可能是 Trac 的 svn pre/post-commit 钩子脚本,如果提交消息没有引用 bug-tracker 中的任何票证,它可以拒绝提交并根据消息内容将 cmets 添加到现有票证中(即提交消息可能包含类似“Fixes #1、#2 和 #8”之类的内容,其中 #1、#2、#8 是票证编号)。
【讨论】:
使用SVN的最佳实践:
当您第一次来到办公室并打开您的Eclipse 项目时,首先要做的是更新您的项目。
更新后,开始你的工作。完成编码后,请检查它是否正确,您的应用程序是否正常运行,没有任何异常。一旦你确定你的代码工作正常,就可以提交代码了。
注意:在提交代码时,不要直接提交。与服务器同步并检查所有需要提交的内容。 注意:不要一次提交整个文件夹。因为您可能已经根据您的要求对文件进行了一些更改,或者您可能已经删除了本地系统中的一些文件。但是服务器上的设置不同。所以单独检查文件并提交代码。
不要直接提交/更新冲突文件。
何时进行覆盖和更新?
当您非常确定自己不需要任何本地 更改并希望完全更新服务器副本。记下 一旦你做了覆盖和更新,你将不会得到任何你的 本地更改。
注意:不要让项目超过一天不更新。也不要在没有提交的情况下保留代码很多天。
与所有在同一个组件中工作的人交流,并讨论他们每天所做的更改。
除非有某种原因,否则不要提交属性和配置文件。因为服务器和云端的设置会有所不同。
不要将目标文件夹提交到 SVN,只有源代码和资源文件夹必须保留在 SVN 存储库中。
当您丢失代码时,不要惊慌!您可以从 SVN 历史记录中取回较早的副本。
不要将项目签出到磁盘的多个位置。在一个位置检查并使用它。
【讨论】:
SVN 本身就是一个良好的开端,其他一些海报就最佳实践提供了一些很好的建议。
我唯一要补充的是,您应该将 SVN 与 CruiseControl 或 TeamCity 连接起来,以推动持续集成流程。这将发送构建电子邮件,并在有人破坏构建时让所有人知道。
这会很早就说明谁在遵循您的流程,谁没有。可能会导致一些摩擦,但从长远来看,您的团队会更好。
【讨论】:
【讨论】:
请记住,您的提交越增量、模块化、离散和简洁,您(或可能其他人)就越容易:
【讨论】:
将此用于 cmets 模板:
[任务/故事 xxx][次要/主要][comment][follow up comment][URL to bug]
【讨论】: