SVN最佳实践 – 在团队中工作

我开始与SVN。 我了解基本的命令,了解基本原理。 我想知道是否有人在团队环境中使用Subversion的技巧或最佳做法。

我可以看到在提交代码时添加合理冗长的消息的好处,但还有其他的事情我应该记住吗?

感谢所有伟大的答案 – 他们已经帮了很多。

鼓励频繁提交。 新版本控制的队友可能觉得他们需要将代码保存在存储库中,直到“工作正常”。 教大家早点提前,经常尽快find问题。 而不是保持代码“,直到它的工作,build议你的队友创build分支function,可能会打破主干。 那导致…

build立分支和标记实践。 除了function分支以外,鼓励你的队友使用分支进行大量的错误修复。 标记工作开始和结束时的主要错误修复。 维护生产/ qa版本的标签(可能是分支机构)。

制定干线政策并坚持下去。 一个例子可能是“主干必须始终没有错误地build立”。 或“中继线必须通过所有的unit testing”。 任何不能达到干线标准的工作都必须在分支机构完成。

不要使用代码更改提交格式更改

如果你想重构一个巨大的文件的空白( Control + K + D ),那很好。 将格式更改与实际的逻辑更改分开提交。 如果你想在文件中移动函数,也是一样的。 提交与实际编辑分开的移动。

我始终坚持的关键概念之一是将相关的代码更改提交一起 。 推论是不要在同一提交中提交不相关的代码更改 。 这意味着不要修复一个提交中的2个错误(除非它是相同的修复),并且不要在2个提交中的每一个中提交一半的错误修复。 另外,如果我需要添加一些新的增强function或某些其他工作所需的系统的不相关部分,我将分别进行增强(和第一个)。 这个想法是,任何人可能想要自己想要的改变(或者自己回滚)应该是一个单独的提交。 当需要合并或回滚中断function时,它将为您节省大量的麻烦。

已经提到很多,这里还有一些:

  1. 如果在源代码pipe理中有不需要的文件(例如configuration文件,编译文件等),请将其添加到忽略列表中 。 通过这种方式,您会注意到任何您忘记添加的文件,因为它总是会显示一个空文件列表,显示为SVN未知的文件。

  2. 添加一个提交后提交事件,该提交事件会将电子邮件发送到您的开发人员邮件列表 (或针对此目标的一个邮件列表 ),这些邮件列表与所做的更改相关,最好是针对该更新的补丁。

  3. 与你的bug跟踪器集成,以便引用提交显示错误/function请求与链接到差异。 像MantisBT这样的Bug跟踪器支持这一点。

  4. 考虑与持续集成 (例如CruiseControl.NET ),用于生成的NAnt和用于unit testing的NUnit / VS 集成 。 通过这种方式,一旦用户签入代码或按计划的时间间隔执行代码编译,unit testing运行,开发人员将获得该进程的反馈。 这也会提醒团队的其他成员,如果存储库已损坏(即不build立)。

那么,基本的:

  • 在版本上启动QA之前创build标签
  • 在风险变化之前创build标签(即大的重构)
  • 为发布版本创build分支以冻结代码。
  • 确保在开始工作之前,人们知道要更新,并在提交之前再次更新。
  • SVN允许不同用户对同一个文件进行多次签出。 确保每个人都解决可能发生的任何冲突。
  • 永远不要为多个用户使用同一个SVN帐户。 可怕的事情可能会导致。

人们给的答案很好。 在SVN的用户文档中总结了大部分的SVN最佳实践 。
重复:

  1. 设置你的仓库结构(你应该有在下面的主干,分支和标签的项目根)
  2. select你的政策重新分支(私人分行,每里程碑/释放/ bug分行等),坚持下去 – 我会build议更多的分支,而不是less,但不需要私人分支机构
  3. select你的策略重新标记 – 越多标签越好,但最重要的是决定你的标签命名约定
  4. select你的策略重新投入干线 – 保持干线尽可能“干净”,它应该随时释放

我想总结一下我坚持的最佳实践:

  1. 不要提交二进制文件 。 应该有单独的二进制文件库,如NexusIvyArtifactory
  2. 应该有存储库结构 。 我个人使用以下存储库结构:

    /trunk /tags /builds /PA /A /B /releases /AR /BR /RC /ST /branches /experimental /maintenance /versions /platforms /releases 
  3. 使用分支types的特定列表。 我的列表如下: 实验维护版本平台发布
  4. 使用特定types的标签PA (pre-alpha), A (alpha), B (beta), AR (alpha-release), BR (beta-release), RC (候选版本), ST (stable)。
  5. 尽量减less合并的必要性 。 当合并可能/鼓励时,应该有规则。
  6. 版本编号 。 应该有build立的版本编号方法来坚持。 通常在软件configurationpipe理计划这样的文档中描述,它是高级项目文档的一部分。 我个人使用复杂的版本编号方法。 根据这种方法,版本有以下模式: Nxx (维护/支持分支), NMx (发布分支), NxK (版本), NMK (发布)。
  7. 尽可能频繁地提交 。 如果这样做比较困难(例如,为了实现function甚至编译代码而需要做太多的修改),应该使用实验分支。
  8. 树干应该包含最新的发展 。 例如,当select在哪里开发新的主要版本( Nxx )的应用程序,在中继线或分支机构中,总是应该为中继线做决定。 旧版本应该分成维护/支持部门。 它假定主要版本和它们的具体内容(架构,兼容性)之间有一个明显的区别,尽早出现
  9. 在发布分支严格的“不要打破”build设的政策 。 同时,只要可能有实验开发或需要合并问题解决的代码库,对主干不一定要严格。
  10. 使用svn:外部 。 它将允许模块化您的项目,build立透明的发布pipe理程序,划分和征服不同的function。
  11. 使用问题跟踪 。 您将能够在提交消息中指出问题引用。
  12. 禁用空提交消息 。 这可以使用预先提交钩子来完成。
  13. 定义你想要不断整合的分支 。 例如,我更喜欢使用持续集成的主干维护发布分支机构。
  14. build立不同types的分支机构的持续整合政策 。 正如我刚才指出的那样,最严格的“不打破build造”规则适用于释放分支,而树干维护分支有时可能被打破。 在干线/维护发行分支上运行的检查列表也有区别。

你可以通过图表说明我的颠覆最佳实践的大纲,以图表说明我使用的软件configurationpipe理方法的主要原则。

有一件事我发现非常有用的是svn:external属性,这意味着你可以从其他仓库引用你自己的目录。 它提供了组织代码和数据的非常好的方法。 一些例子是:

  1. 如果你有不同的模块/库的代码库和你正在使用的引用。 这意味着您可以为每个可执行文件设置一个元数据存储库。 如果它是一个只使用几个模块的小型可执行文件,则不需要检出整个树。 这样做的效果是,您可以获得每个模块的SVN修订号。
  2. 将大型二进制数据(如编译版本的库)添加到代码库通常被认为是一个坏习惯,但它可以非常方便。 如果您只是将所有使用的库的所有版本添加到不同的存储库,则可以获得两个最好的世界。 您可以在您使用的库的版本中引用您的代码库。 在检查你的代码库的时候,你会得到代码和二进制文件。 然而,二进制文件存储在一个大的仓库,你不需要像你的源代码一样严格地备份,并且源代码库保持很小,只包含文本。

与bug跟踪软件集成 如果你使用的是Bugzilla ,你可以设置它,所以如果你的注释以“Bug XXXX”开头,你的SVN注释会自动添加为给定错误的注释,包括SVN Web界面的链接。

了解SVN的分支和合并工具和约定。

与其他团队成员合作的最佳方式是将工作分解为完整的开发特性/修复,然后分别在分支中进行个别更改。 然后,在完成/准备好/批准合并后,将更改合并回主干分行/主干。

通过这种方式,个人可以实现共同的目标(无论是在同一分支上还是在不同的分支上),而不会与其他变化相冲突。

你的里程可能会有所不同,这可能是只有两个左右的人矫枉过正。

如果您使用的是与SVN完美集成的良好工具,则会更容易。 这些可以很容易地看到改变了什么,然后提交全部或部分更改,并经常将工作副本更新到SVN中的最新版本。

我推荐龟SVN (如果您使用的是Windows)和Visual SVN (如果您使用的是VS)。

另请参阅您是否可以设置它,以便您在提交更改(通常还包括提交消息和更改的文件列表)时收到电子邮件或类似的通知。 像CVSDude这样的服务提供这一点。 我发现在更新我的工作副本之前知道更新已经完成,然后对该更新中包含的内容有所了解是很有帮助的。

除了分支政策等。 (其中一个尺寸绝对不适合所有),你应该有很好的承诺:

  • 如果可能的话,承诺应该涉及一个单一的工作; 一个错误修复,一个新的function – 应该有一些“逻辑”来改变你所做的改变
  • 该提交应该有一个描述性的评论,这将有助于您find它浏览存储库的历史。 大多数人build议在开始时写一个句子来描述整个提交和下面更详细的描述
  • 如果可能的话,如果可能的话,你应该把这个提交和bug追踪系统联系起来。 Trac,Redmine等人 让您创build从错误到提交的链接,反之亦然,非常方便。

源控制的黄金法则: 提前入住,经常入住

有关如何组织您的存储库的提示:

  • 你如何组织你的版本控制库?
  • SVN书第5章仓库pipe理
  • 存储库布局

在解决任何合并冲突之前,请向您的团队咨询其变更,或至less仔细查看差异。 要求他们自己检查合并的代码,以确保他们的添加不会在合并中丢失。

有一件事我看到,减less了提交失败,就是有好的预先提交脚本。 例如,您可以在提交更改之前运行任何unit testing。 这会导致承诺有点慢,但是通过避免踩到别人的脚趾并且必须道歉来节省时间。 当你有一个大的开发团队和非常频繁的提交时,这当然会变得更难pipe理。

与bug跟踪器和提交策略实施集成的一个例子可能是Trac的svn pre / post-commit挂钩脚本,如果提交消息没有在bug跟踪器中引用任何票据并向现有的注释添加注释,则脚本可以拒绝提交根据消息内容(例如,提交消息可能包含“修复#1,#2和#8”,其中#1,#2,#8是票号)。

SVN本身是一个好的开始,其他一些海报已经提供了一些关于最佳实践的伟大build议。

我唯一要补充的是,你应该把SVN与CruiseControl或TeamCity连接起来,以推动持续集成过程。 这将发送构build电子邮件,让别人知道什么时候有人打破了构build。

这将很早就知道谁跟随你的过程,谁不是。 可能会导致一些摩擦,但从长远来看,你的团队将会变得更好。

使用SVN的最佳做法:

  1. 当你第一次来到办公室打开你的Eclipse项目时,第一步就是更新你的项目。

  2. 在更新之后,开始你的工作。 当你完成你的编码,检查它是否正确,你的应用程序是否正常运行,没有任何例外。 一旦你确定你的代码工作正常,是时候提交代码了。

注意:在提交代码时,不要直接提交。 与服务器进行同步,检查所有需要提交的内容。 注意:不要提交整个文件夹一次。 因为您可能已经对文件进行了一些更改以满足您的需求,或者您可能已经删除了本地系统中的某些文件。 但是在服务器上的设置是不同的。 所以单独检查文件并提交代码。

  1. 不要直接提交/更新冲突文件。

  2. 什么时候重写和更新?

    当你非常确定你不需要任何本地修改,并且想要完全更新服务器拷贝时。 记下一次,如果你做覆盖和更新,你将不会得到任何你的本地更改。

    注意:不要保持项目不超过一天更新。 也不要保持代码没有承诺多天。

  3. 沟通谁在同一部门工作,并讨论他们每天做了哪些改变。

  4. 除非有某些原因,否则不要提交属性和configuration文件。 因为这些设置在服务器和云中会有所不同。

  5. 不要将目标文件夹提交到SVN中,只有源代码和资源文件夹必须在SVN存储库中维护。

  6. 当你丢失你的代码时,不要惊慌! 您可以从SVN历史logging中找回更早的副本。

  7. 不要将项目签出到磁盘的多个位置。 在一个位置检查它并使用它。


  • 精确评论每一个提交

  • 不要打破(主线)build设!

  • 一旦逻辑单元发生变化,立即提交

  • 避免使用Subversion作为备份工具

  • 稍微分支/合并尽可能

更多细节可以在SVN最佳实践中find。

DEV是否在分支上工作?

  1. 频繁地向你的分支提交
  2. 离散/模块提交给你的分支( 见这里 )
  3. 经常更新/合并来自主干。 不要重新坐在你的分支上

社区干线

  1. 应该始终build立/工作
  2. 每次提交一个问题( 在这里再次看到 )大多数情况下,您或其他人可以一次退出一个
  3. 不要将重构/空白变化与逻辑变化混为一谈。 你的队友将有一个艰难的时间提取你实际上做了什么

请记住,您提交的越多,模块化,离散和简洁,对您(或其他人)来说越容易:

  • 逐渐退出更改
  • 在不经过大量的空白和variables名称变化的情况下,直观地了解实际执行的操作。
  • 当完成的工作与消息长度的比率较低时,提交消息意味着更多。

将其用于评论模板:

[任务/故事xxx] [未成年人/专业] [评论] [跟踪评论] [错误的URL]