SVN最佳实践-团队合作


98

我从SVN开始。我了解基本命令并了解基本原理。我想知道是否有人在团队环境中使用Subversion有任何技巧或最佳实践。

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

感谢您提供的所有出色答案-他们提供了很多帮助。

Answers:


76

鼓励频繁提交。 刚接触版本控制的队友可能会觉得他们需要将代码保留在存储库之外,直到“其工作正常”为止。教会每个人尽早做出承诺,并经常尽快发现问题。建议您的队友为可能会破坏主干的功能创建分支,而不是仅仅保留代码直到起作用。导致...

建立分支和标记实践。 除了功能分支外,鼓励您的队友使用分支进行大型错误修复。标签主要错误修复在工作的开始和结束时进行。维护用于生产/质量检查发布的标签(可能还有分支)。

建立中继策略并坚持下去。 一个例子可能是,“行李箱必须始终没有错误地建造”。或“行李箱必须始终通过所有单元测试”。任何尚不能满足中继标准的工作都必须在分支机构中完成。


1
分支和合并是SVN中的一个难题。其他VCS处理起来要好得多,但是我永远不会提倡对SVN进行繁琐的分支处理。
Branan

7
@布兰妮·错误 这是因为您不知道如何正确使用源代码控制。分支时,您应该是一个很好的开发人员,可以完成工作并从主干更新分支,并每天或每天几次(从您的选择)合并从主干到分支的最新更改(最终选择)。合并了堆积如山的地狱。在我的PC上,我一直有至少4-5个分支一直在本地运行,这从来都不是人们梦night以求的事情,因为我做得对...经常更新它,以便使人们可以将更改提交到主干和工作和添加有关的代码
PositiveGuy

66

不要通过代码更改提交格式更改

如果要重组巨型文件的空白(Control+ K+ D),可以。提交格式更改与实际逻辑更改分开。如果要在文件中移动功能,也是如此。与实际编辑分开提交移动。


2
所以我整天编辑文件,现在是时候提交文件了,我该如何区分格式?
达斯汀·盖兹

23
如果要使用现有代码格式化更改,请先执行,提交,然后添加新代码/编辑代码。或先添加/编辑,然后提交,然后进行格式更改。这样,添加/编辑上的差异实际上是有道理的,而不仅仅是说“现在一切都变了!”
lc。09年

1
+1。无关的更改会增加审查相关更改的工作量。这也使得合并/移植更改(例如,其他分支)变得更加困难。
Ates Goral

2
虽然这是遵循的好习惯,但我认为任何人都不可能执行此操作。Jason是对的,一个好的开发人员将意识到他们可以使用一个好的diff工具(乌龟SVN内置一个)来忽略空白以滤除噪声。
Ken Sykora

1
这可以通过代码审查和对团队成员的教育来实施。我认为将逻辑更改与代码更改区分开来应该不是审阅者的负担。这应该是实施者的责任。
Marquez

43

我一直坚持的关键概念之一是将相关的代码更改一起提交。结果是不要在同一提交中提交无关的代码更改。这意味着不要在一个提交中修复2个错误(除非是相同的修复),也不要在2个提交中的每个提交中都修复一半的错误。另外,如果我需要向系统的不相关部分添加一些新的增强功能或其他一些其他工作所需的功能,则可以单独(并且首先)提交增强功能。这样的想法是,任何人可能想独自拥有(或自行回滚)的任何更改都应单独提交。进行合并或回滚损坏的功能时,它将为您节省很多头痛。


4
为此+1。犯错时似乎很痛苦。但是,当您查看旧代码时,充满原子提交的回购是无价的。
戈登·威尔逊,

2
这不是功能分支的用途吗……在功能分支上根据需要执行任意数量的提交,然后当您准备好将其合并到主干时……回滚仅意味着删除合并的提交。+1用于将相关代码保持在一起...
farinspace

16

已经提到了很多,这里还有更多:

  1. 如果您有不需要的文件(例如配置,编译文件等),请将其添加到忽略列表中。通过这种方式,您总是会期望看到一个空白列表,这些副本使SVN未知,从而使您忘记添加任何文件。

  2. 添加一个后提交事件,该事件将向您的开发人员邮件列表(或针对该目标的邮件)发送一封电子邮件,其中涉及已提交的更改以及理想的补丁程序。

  3. 与您的错误跟踪器集成,以便对提交的引用显示在具有差异链接的错误/功能请求中。像MantisBT这样的Bug跟踪器支持此功能。

  4. 考虑与持续集成(例如CruiseControl.NET),用于构建的NAnt和用于单元测试的NUnit / VS 集成。这样,一旦用户签入代码或在计划的时间间隔内对代码进行编译,运行单元测试,并且开发人员就可以获取该过程的反馈。如果存储库已损坏(即未构建),这还将提醒团队的其他成员。


我们使用的做法是所有配置文件都已更改扩展名,例如config.php.config或类似的东西,这样我们就可以将配置文件保存在服务器上,但是每个团队成员都有自己的名字。当配置文件中的某些重大更改比我们制作复制形式的svn版本...
齐达内

15

好吧,基础知识:

  • 在版本上开始质量检查之前创建标签
  • 在有风险的更改之前创建标签(即重大重构)
  • 为发布的版本创建分支以冻结代码。
  • 在开始编写一段代码之前,请确保人们知道要进行更新,并在提交之前再次进行更新。
  • SVN允许不同用户多次检出同一文件。确保每个人都解决了可能发生的任何冲突。
  • 请勿将同一SVN帐户用于多个用户。可能会造成可怕的后果。

7
我对分支和标签执行相反的操作。分支用于主干的分支,最终与主干合并。标签用于代码冻结。
steve_c

1
分支是可以更改的副本。标签是不应更改的副本。 svnbook.red-bean.com/en/1.2/svn.branchmerge.tags.html
matpie,2009年

我做类似的事情。我将代码发布到质量检查或生产环境时进行标记和分支。这样,我们有一个只读标记以及一个分支来解决该版本的错误修复,这些错误修复不会影响可能在主干上进行的新功能开发。
JamesEggers,2009年

Svn还允许同一用户的同一文件夹的多个签出。因此,如果您发现需要进行与当前工作无关的更改(例如,某些客户要求紧急修复,或者您偶然发现了完全不相关的错误),请再次签出并单独进行修复。
PMF

“标签”应用于代码冻结。如果您尝试更改“标签”分支,您的SVN客户端甚至会警告您。
Danijel '18

12

人们给出的答案很棒。svn用户文档中总结了许多此类内容,以获取SVN的最佳做法
重复:

  1. 设置您的存储库结构(您应该在项目根目录下具有主干,分支和标签)
  2. 选择您的策略重新分支(私有分支,每个里程碑/发行版/ bug的分支等)并坚持执行-我建议多分支而不是少分支,但不需要私有分支
  3. 选择策略重新标记-标记越多越好,但最重要的是决定标记的命名约定
  4. 选择重新提交到中继的策略-保持中继尽可能“干净”,它应该可以随时释放

那是一个非常古老的最佳实践,所以我认为CollabNet不再推荐它们了。有没有新的最佳做法?您提到的版本可以回溯到SVN 1.0
mliebelt 2011年

1
@mliebelt-我将链接更新为apache版本。无论年龄多大,选择正确的回购结构,分支策略,标记策略和中继提交策略的想法,以及上面给出的很好的答案仍然是正确的。
hromanko 2011年

但是,“需要时分支系统”的描述还是很疯狂的。听起来像是办公室拍摄的秘方。
naught101 '16

10

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

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

    /trunk
    /tags
        /builds
            /PA
            /A
            /B
        /releases
            /AR
            /BR
            /RC
            /ST
    /branches
        /experimental
        /maintenance
            /versions
            /platforms
        /releases
    
  3. 使用分支类型的特定列表。我的清单如下:试验维护版本平台发行版
  4. 使用特定类型的标签PA(pre-alpha),A(alpha),B(beta),AR(alpha-release),BR(beta-release),RC(release候选),ST(stable)。
  5. 最小化合并的必要性。可能/鼓励合并和不合并时应有规则。
  6. 版本编号。应该建立坚持的版本编号方法。通常,它在诸如软件配置管理计划之类的文档中进行描述,它是高级项目文档的一部分。我个人使用复杂的版本编号方法。根据这种方法,版本的下列模式:NXX(维护/支持分支机构),NMX(发布分支),N×K个(构建),NMK(释放)。
  7. 尽可能频繁地提交。如果它趋于困难(例如,为了实现功能甚至编译代码而需要进行太多更改),则应使用实验性分支。
  8. 行李箱应包含最新动态。例如,当可以选择在主干或分支中开发新的主版本(Nxx)应用程序时,应该始终选择主干。旧版本应分支到维护/支持分支。它假定主要版本之间有明确的区别,并且其详细信息(体系结构,兼容性)应尽早出现
  9. 在发布分支上严格“不破坏构建”策略。同时,对主干来说并不一定严格,只要它具有实验性开发或代码库需要解决合并问题即可。
  10. 使用svn:externals。它将使您的项目模块化,建立透明的发布管理程序,划分并征服不同的功能。
  11. 使用问题跟踪。您将能够在提交消息中指出问题参考。
  12. 禁用空的提交消息。可以使用预提交钩子来完成。
  13. 定义要持续集成的分支。例如,我更喜欢对trunkmaintenancerelease分支使用持续集成。
  14. 为不同类型的分支机构建立持续集成策略。正如我之前指出的,最严格的“请勿破坏构建”规则适用于发布分支,而中继维护分支有时可能会被破坏。在干线/维护发布分支上执行的检查列表之间也存在差异。

您可以以图表形式找到我的Subversion最佳实践的概述,这些图表说明了我使用的软件配置管理方法的主要原理。


那么,您如何在团队中工作?不同的人使用不同的分支吗?如何避免冲突?您的答案不涵盖团队合作:(
DataGreed 2012年

2
问:如何避免冲突?答:尽量减少合并的必要Trunk应该包含最新的开发尽可能频繁地提交问:不同的人使用不同的分支吗?答:每个分支可以由一个或多个人使用。区分不同的分支机构类型也很重要:试验,维护和发布,它有助于避免冲突。问:您的回答不涉及团队合作。答:乍一看似乎如此。自动使用版本控制意味着团队合作。我描述了一组规则(作为道路规则),这些规则有助于更有效地协作
交替

7

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

  1. 如果您有一个单独的代码存储库,则不同的模块/库和所使用的模块中的引用。这意味着您可以为每个可执行文件拥有一个元存储库。如果它是仅使用几个模块的小型可执行文件,则无需检出整个树。这样的效果是,您可以获得每个模块的SVN版本号。
  2. 将大型二进制数据(例如库的已编译版本)添加到代码存储库通常被认为是一种坏习惯,但这确实很方便。如果仅将使用的所有库的所有版本添加到不同的存储库中,则可以充分利用两个世界。您引用在代码存储库中使用的库的版本。检出代码存储库时,您还将获得代码和二进制文件。但是,二进制文件存储在大型存储库中,您无需像源代码那样严格地对其进行备份,并且源代码存储库很小,仅包含文本。

1
我喜欢第2点。由于使用svn:external时可以指定版本号或不指定版本号,因此您可以将某些库“固定”到特定版本,而允许其他库“跟踪”最新版本。
j_random_hacker

使用“ svn:external”是最强大的功能之一,我会说SVN的大多数基本功能。必须的。
Danijel '18

5

与您的错误跟踪软件一起使用集成。如果您使用Bugzilla,则可以对其进行设置,如果您的注释以“ Bug XXXX”开头,则您的SVN注释会自动添加为给定错误的注释,包括指向该修订版的SVN Web界面的链接。


Trac系统具有良好的SVN集成bug跟踪,加上时间表,提交的diff,维基等
道格·柯里

吉拉(Jira)还跟踪与该问题有关的提交
Dan Soap 2009年

4

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

与其他团队成员合作的最佳方法是将工作分解为完整的开发功能/修订,然后对每个更改进行工作,每个更改都在一个分支中。然后,在完成/准备/批准要合并时,将更改合并回主线分支/主干。

这样,个人可以朝着一个共同的目标(在同一分支或不同分支上)努力,而不会与其他更改发生冲突。

您的里程可能会有所不同,这可能只对两个左右的人造成过大伤害。


3

如果您使用的是与SVN良好集成的良好工具,那么它将变得更加容易。这些功能使您可以轻松查看已更改的内容,然后提交所有或部分更改,并经常将工作副本更新为SVN中的最新版本。

我建议使用Tortoise SVN(如果使用Windows)和Visual SVN(如果使用VS)。

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


3

除了分支政策等。(一种尺寸绝对不能适合所有尺寸),您应该提交良好的内容:

  • 提交应与一个件的工作,如果可能的; 一个错误修复,一个新功能-您所做的更改应该有一些“逻辑”
  • 该提交应具有描述性注释,以帮助您在浏览存储库历史记录时找到它。大多数人建议在开始时写一个句子来描述整个提交,并在下面进行更详细的说明
  • 如果可能的话,您应该将提交与错误跟踪系统联系在一起。Trac,Redmine等。让您创建从bug到commit的链接,反之亦然,这非常方便。


2

在解决任何合并冲突之前,请咨询您的团队有关其更改的信息,或者至少要非常仔细地查看差异。要求他们自己检查合并的代码,以确保添加的内容在合并中不会丢失。


2

我见过的可以减少损坏的提交的一件事是拥有良好的预提交脚本。例如,您可以在提交更改之前运行任何单元测试。这将导致提交速度有些慢,但是可以避免踩到某人的脚趾而致歉,从而节省了时间。当然,当您拥有庞大的开发团队并且频繁提交时,这将变得很难管理。


+1用于预提交脚本。好想法。我想知道是否有一种方法可以让git在不运行的情况下进行提交呢?
naught101

2

Trac的svn pre / post-commit钩子脚本是与bug跟踪器和提交策略强制集成的示例之一,如果commit消息未在bug跟踪器中引用任何票证并向现有注释添加注释,则该脚本可以拒绝提交。基于消息内容的票证(即,提交消息可能包含“ Fixes#1,#2和#8”之类的内容,其中#1,#2,#8是票证编号)。


2

使用SVN的最佳做法:

  1. 第一次上班并打开Eclipse项目时,第一步必须是更新项目。

  2. 更新后,开始工作。完成编码后,请正确检查编码,应用程序是否正常运行而没有任何例外。一旦确定代码可以正常工作,就可以提交代码了。

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

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

  2. 何时进行覆盖和更新?

    当您非常确定不需要任何本地更改并且想要完全更新服务器副本时。请注意,一旦执行覆盖和更新,就不会获得任何本地更改。

    注意:不要在没有更新的情况下保留项目超过一天。也不要在没有提交很多天的情况下保留代码。

  3. 交流谁都在同一组件中工作,并讨论他们每天所做的更改。

  4. 除非有某些原因,否则不要提交属性和配置文件。因为服务器和云中的设置将不同。

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

  6. 当您丢失代码时,不要惊慌!您可以从SVN历史记录中获取较早的副本。

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



1

SVN本身就是一个好的开始,其他一些发布者也提供了一些有关最佳实践的好建议。

我唯一要补充的是,您应该将SVN与CruiseControl或TeamCity挂钩,以驱动持续集成过程。这将发送构建电子邮件,并在有人破坏构建时通知所有人。

这将在很早的时候告诉您谁在遵循您的流程,谁没有遵循。可能会导致一些磨擦,但从长远来看,您的团队会变得更好。


1
同意,CruiseControl拯救了我的团队很多次。
Gordon Wilson

1
  • 每次提交都提供精确的注释

  • 不要破坏(主线)构建!

  • 逻辑单元更改后立即提交

  • 避免将Subversion用作备份工具

  • 尽可能多的分支/合并

可以在SVN最佳实践中找到更多详细信息。


0

DEV是否在分支机构上工作

  1. 频繁提交到您的分支
  2. 离散/模块化提交到您的分支请参阅此处
  3. 经常从主干更新/合并。不要坐在您的分支上而无需重新定基

社区干线

  1. 应该总是建立/工作
  2. 每次提交一个问题再次参见此处通常,您或其他人可以一次取消一个问题
  3. 不要将重构/空格更改与逻辑更改混为一谈。您的队友将很难提取承诺中的实际内容

请记住,您提交的内容越增量,模块化,离散且简洁,您(或可能其他人)将越容易做到:

  • 逐步撤消更改
  • 直观地了解您的实际操作,而无需筛选大量空白和变量名更改。
  • 当完成的工作与消息长度的比率较低时,提交消息意味着更多。

0

使用它作为评论模板:

[任务/故事xxx] [未成年人/主要] [评论] [关注评论] [错误网址]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.