寻找有关SubVersion的最佳实践,分支和社交方面的提示

Arm*_*ndo 9 svn version-control perforce branch

我和我的团队目前使用Perforce进行版本控制.我们曾经把所有东西都提交到trunk,直到有一天我们需要在程序中添加几个项目,所以我们为我的老板创建了一个分支,为我创建了一个分支,另一个分支进行了测试.一切顺利,直到我们尝试将分支合并回主干.我们Visual Studio(VS)和它生成的解决方案文件由于某种原因,它不适用于Perforce.经过很多努力,我们将分支部分合并到主干中.我正在考虑转向颠覆.我在我的本地电脑上有Subversion,我对Visual Studio分支和维护没有任何问题.我建议老板搬到SVN.虽然我的老板对于移动50万行代码的想法持开放态度,但我需要建立一个强有力的案例.我是最年轻的毕业生程序员,所以说我的想法需要比其他人更多的牛肉=)

我决定在我们的一台服务器上安装SVN并将代码传递给它.我们不会很快摆脱Perforce,但我的目标是以非常缓慢的方式杀死它并且让我的队友变态SVN使用起来有多容易,我已经有一个人在我的船上.

由于我可以从头开始配置SVN,我想应用SVN的最佳实践.我读了红豆书,我打算按照他们的回购布局和备份提示,但我有更多与社交和分支问题有关的问题.以下是我对社会问题的疑问,

  1. 有没有办法以社交方式防止源冲突?如果是这样,沟通冲突变化的最佳方式是什么?

  2. 我也计划在该服务器上安装CMS.所以我的队友可以写作或传达他们有分支机构之类的东西,但我不知道是否还有其他工具来跟踪我们项目的历史性健康和缺陷.

  3. 即使我的公司采用扁平化管理方法,像我这样的新秀如何能够在不打破无形"高级"等级的情况下说服或强制与高级程序员进行社交沟通?

对于分支和标记,

  1. 我不希望其他团队分支在程序中添加"Hello,World!"代码.我想把分支视为一种与众不同的东西.任何人都可以给我一个关于何时添加创建分支的经验法则?什么时候合并?

  2. 在什么情况下分支分支是个好主意?

  3. 对于标记,我的理解是标记符号表示程序的静态点(即:v1.0,v2.5)是正确的吗?

  4. 如果我创建一个分支并开始编写我的更改,我的队友应该从我的分支开始同步吗?还是他们还应该在后备箱里发展?或者他们应该为自己创建另一个分支?

我为我的所有问题道歉,但是当涉及到版本控制时,我觉得我在BP清理过程中游泳了墨西哥湾.

Cor*_*rch 12

没有特别的顺序:

  • 防止过度冲突的最佳方法是精心设计的项目.分离关注点的DRY代码可以实现更改而不会撕裂整个项目.如果核心代码的更改需要50%的源文件更新,则冲突将很常见.
  • 当你做出改变时,轻轻地踩踏.不要仅因为您不喜欢它的外观而重构不属于您的更改要求的函数.只要他们处理不同的问题,两个开发人员对同一来源进行更改是完全合理的.只要您不尝试合并由不同开发人员执行两次的相同更改,SVN合并就能很好地工作.使重构成为变更计划的一部分.
  • 评估位于SVN之上的工具,并为您的团队提供有关代码更改的另一个视角.TracFisheye就是例子.
  • 明智地使用钩子脚本发送通知或更新项目维基.这比提醒人们手动发送通知更有效.请注意,如果您经常通知,人们会忽略您的通知.
  • 考虑持续集成,以便开发人员立即获得有关其更改的反馈.Hudson是一个很好的工具,可以与SVN集成.持续集成工具有时也包括与社交工具的集成.Hudson的构建通知器就是例子.
  • 分支适用于不适合单个发布开发周期的更改,或者当更改将破坏团队其余部分的项目时(总是分支而不是等待数周才能检入).关于何时分支的意见不同.请确保您的团队同意一种方法,以便结果一致.
  • 不同的团队使用不同的标签,但版本号或发布声音合理.
  • 只有处理分支功能的开发人员才能在该分支中工作.
  • 早期合并,经常从主干到分支合并.这使得最终合并更容易回到主干.
  • 只要您进行更改,请在做出决定之前评估分布式版本控制系统,如GitMercurial.


Dav*_* W. 5

我实际上喜欢Perforce,我认为Perforce在跟踪合并方面比Subversion做得更好,但是Perforce存在一些问题,一个是与第三方工具的集成 - 尤其是VisualStudio.并且,(加上开发人员并不喜欢这么多的事实)使得很难在许多网站上推荐.

如果您打算开始转向Subversion,我会说您最好的策略是集成到您当前的工具中,以及Subversion与其他第三方工具有更多集成点的事实.

以下是我要点的一些观点:

  • Subversion与VisualStudio的集成更简洁.
  • Subversion集成到更多第三方工具中.部分原因是Subversion更简单,更清洁.没有意见.您不必标记要编辑的文件.您可以在任何地方创建工作目录.部分原因是Subversion更受欢迎,因此大多数第三方工具都意识到如果他们想要使用它们,他们必须与Subversion集成.

您还可以指出Subversion和Perforce之间的相似之处,以及您喜欢Perforce的功能在Subversion中:

  • Perforce和Subversion都实现了文件间分支.这是Perforce使用目录作为分支的术语.
  • Subversion和Perforce都使用更改列表/更改集(无论使用哪个术语).在Perforce中,更改集是文件版本控制的补充.在Subversion中,存储库修订版是更改集.
  • Subversion和Perforce都实践了原子提交.

最佳实践是超越工具,尤其是版本控制系统.您将需要缺陷跟踪工具,持续构建系统和发布存储库.最佳实践是沟通和信任:

  • 你相信你的构建系统吗?
  • 你能一次又一次地可靠地创建构建吗?
  • 你知道你的构建进展了吗?
  • 质量保证团队是否知道要测试什么?他们知道在特定构建中修复了哪些缺陷?
  • 开发人员是否知道发现了哪些缺陷?
  • 您的开发人员是否知道他们应该添加哪些功能,或者他们需要修复哪些缺陷?
  • 您如何知道特定版本是否已获批准发布?

如果您可以展示您计划如何回答这些问题,那么您可以为您的计划建立一个强有力的案例.展示Subversion如何适应这些计划.展示如何使用VisualStudio更好地工作以及如何使开发人员的工作更好.

如果您正在构建.NET应用程序,我强烈建议您查看Nant.(我假设您通过打开VisualStudio并点击F5或者构建的任何内容来进行正式构建.如果您不这样做,那么您将领先于我见过的90%的VisualStudio站点).然后,您可以使用Hudson作为持续构建服务器.Hudson也可以充当发布存储库,因为它可以存储构建的工件.这意味着人们可以轻松访问官方版本.

最棒的是,通过Hudson插件,您可以标记哪些版本是正式版本,标记版本等.它集成了Jira,Track,Bugzilla,MantisBT和许多其他缺陷跟踪系统.它也适用于Redmine,包括缺陷跟踪系统,留言板,图表,维基等.这是您可以使用的另一个工具.

我们的想法是定义问题,定义解决方案,并展示Subversion等工具如何适应它们.

请记住,最佳实践不仅仅是一种可以反复重复实施的方法.这是了解您的项目的一种方式.它确保每个人都知道发生了什么.它确保每个人都完全信任这个过程.它确保您确切知道产品中发生了什么.

有各种各样的提示,人们一遍又一遍地重复关于最佳实践:可重复性,及早发现缺陷,自动化一切,敏捷开发,小口而不是进行大规模更改,不破坏构建等等.但是,这些只是手段到最后.请记住大局.

我还发现将这些工具出售给使用它们的人是绝对重要的,而且对于开发人员来说,你认为这样一个巨大的优势并不是那么好.开发人员希望能够获取他们需要的文件,进行修改并检查他们的更改.无论是Perforce还是Subversion还是CVS,他们都不会诅咒.他们不关心变更集或原子签入.他们不关心Interfile分支.他们只是想知道他们正在查看正确的文件,并且当他们进行更改时,它就会被传递.如果您要销售Subversion,您可以告诉开发人员如何改进他们的流程并让他们的生活更轻松.

保持简单.SCM的轻手最好.如果人们发现这个过程非常艰难,他们会尽力绕过它.


Chr*_*sen 5

Couriosity只是闪耀出你的问题;) - 尽量不要迷失在一起做/想太多事情.

所以回答他们的问题..

1. 有没有办法以社交方式防止源冲突?如果是这样,沟通冲突变化的最佳方式是什么?

我所知道的主流源代码控制软件在将这些工作集成到另一个(合并)之前,会带来一个关于可能存在冲突的工作的良好实现通知.正如Corbin March提到的那样,除了DRY和关注点分离之外,我认为"每日更新","提前提交,经常提交"和"延迟提交"(见下文)都是实实在在的做法.

尽早承诺有其局限性.语法错误免费,并且根据您的bugtracker /任务组织系统,只应提交完整的工作工件.

恕我直言,当您遇到自己无法解决的源冲突时,要求帮助的社交技能确实不多.

2. 我打算到CMS安装到该服务器也是如此.所以我的队友可以写作或传达他们有分支机构之类的东西,但我不知道是否还有其他工具来跟踪我们项目的历史性健康和缺陷.

这听起来像一个非常"分布式"的方法.不是在位置而是在责任方面.您正在创建软件产品并偶尔做一些发布吗?因此,责任应该增加并集中进一步"下游".整个团队应该熟悉的唯一分支是用于修复东西的发布分支(没有功能)和主线(主干).所有其他事项,功能分支,集成分支,"备份"分支,专用分支等将由请求或执行它们的人管理.为什么你或同事"A"关心同事"B"分支主线以及时发展他的实验性特征?同事"B"通过开发一些开创性的东西,负责他的分支并使其与主线保持一致.要么不断地将主线的变化合并到他的分支,要么在重新整合他的新代码之前.如果您想了解更多,研究集成分支.

至于工具集..在SVN(Jira,trac,mantis,redmine ..)中可以很好地整合的任何bugtracker应该可以胜任.但我不明白这部分问题与你的冲突问题有什么关系.

3. 即使我的公司采用扁平化管理方法,像我这样的新秀如何能够在不打破无形"高级"等级的情况下说服或强制与高级程序员进行社交沟通?

我认为你高估了油井工作流程所需的沟通量.你提到的内容表明你的公司缺乏一个工作流程,在这个工作流程中,你可以在根本上对抗冲突(参见1.和2.),在这种情况下你需要进行更多的沟通,可能会产生不必要的高额开销.拥有CMS或某种"我在这里工作"的标记系统可能仍然值得继续.

你表示,即使在他们应该做得更好的冲突案件中,一些高级开发人员也不喜欢谈论或社交.不要让他们通过合并为他们逃脱.合并应由分支所有者完成.当冲突发生时,至少有一个冲突方必须决定变化.理想情况下,双方一起坐在差异上,但不是第三方最初不涉及有关来源.解决冲突失败(选择错误的更改)可能会导致构建破坏,甚至更糟的是未检测到的错误.人们需要意识到.

如果高级开发人员"A"(合并主线变成他的分支)诅咒冲突但不与高级开发人员"B"交谈,他们的主线变化与他的冲突,那么担任调解员并不容易.如果它不是为你划线,请尝试与开发人员B交谈并说服他接近A以更快地解决冲突并减少错误.

但最终它是开发者"A"的责任,而不是你的责任.你似乎已经向你的同事举了一个例子.如果这还不够,请尝试小心地指出,没有足够的通信是构建中断的原因.也许可以私下和一位大四学生讨论你的想法,开放但不要辱骂."我们可以更好"听起来比"你们做错了"更好.而对于你作为一个年轻的专业人​​士,句子如"如果你告诉我什么时候与你的代码发生冲突我觉得我的代码会更好"可能比"当你得到合适的人时要求第二双眼睛"更合适冲突",即使后者更直接.

如果这一切都无济于事,您可以考虑与您的老板或团队负责人讨论您遇到的障碍.如果他不是傻瓜,他/她会听.

用于分支和标记

1. 我不希望其他团队分支在程序中添加"Hello,World!"代码.我想把分支视为一种与众不同的东西.任何人都可以给我一个关于何时添加创建分支的经验法则?什么时候合并?

合并请参见下面的问题4.

对于分支:你完全正确地试图拥有尽可能少的分支.分支是有代价的.复杂性,合并开销等我倾向于坚持"分支不兼容的政策".你问什么政策?您的每个主要分支都应附加一组记录的规则.

例子:

  • 标签2.0.4
    • 不允许提交
  • 发布-2
    • 仅修复了允许的现有功能
    • 签到应具有发布质量
  • 树干
    • 必须编译/验证
    • 允许扩展开发的API
    • 禁止重命名和删除API
    • 只完成bugtracker问题
    • 从发布分支接收合并
  • 功能apirefactoring
    • 可能会改变已开发的API并破坏兼容性
    • 从主干中拉出合并是功能开发人员的任务

你看到有3个虚构的分支和一个标签."feature-apirefactoring"是正确应用"不兼容策略分支"的示例.

应通过分割不同类型的开发活动来使用分支来降低风险并提高效率.分支政策单独定义了可接受的发展和风险潜力.希望你的后备箱更稳定?定义新策略"不要引入W3C验证器警告".如果开创性的开发工作为了效率而必须打破这个规则或者提供快速的概念验证(我们先破解并稍后清理),它就是它自己的分支的一个很好的候选者.

每当您或同事感到违反规则的冲动时,因为不遵守既定政策会更简单或更安全,您就可以很好地讨论分支创建.

2. 在什么情况下分支的一个分支是一个好主意? 上面回答我认为:).

我遇到的一些例子:

  • 释放准备时从树干分支稳定分支(没有新功能)
  • 当集成过于复杂和耗时时,来自功能分支的分支集成分支
  • 从一个已经完全稳定的版本中分支出一个"特别版"版本分支,该版本具有一些独特功能或特定客户可能存在的某些不稳定的差异.
  • 从您的主干分支翻译分支,只获得措辞变化,因此无法破解

还有十几个.您的政策越精细,您的分支就越具有异国情调.

3. 对于标记,我的理解是标记符号表示程序的静态点(即:v1.0,v2.5)是正确的吗?

是.对于subversion,它可以被描述为别名."/tags/1.7.2"可能是项目的状态,因为它是在修订版30932.您可以在某个版本准备就绪时记下修订版号,并将您的新资源与其进行比较或创建此旧版状态的结帐.或者您可以使用更容易记住的标记名称.

subversion中的标记也只是一个不接收任何提交的分支.

4. 如果我创建一个分支并开始编写我的更改,我的队友应该从我的分支开始同步吗?还是他们还应该在后备箱里发展?或者他们应该为自己创建另一个分支?

简短的回答:当你不确定时,使用主干并且根本不合并(同步,推,拉).

答案很长:在一个理想的世界中,不需要分支机构,因为所有开发人员都会在发生变化时立即获得团队检查的所有更改.在理想的世界中,这些变化不会与任何开发人员自己的未提交工作发生冲突.无论开发人员在我的理想世界中检查什么,也是完全正确的,没有缺陷和故障.

唉,程序员世界并不完美.因此,您创建分支以保护自己免受同事所做的更改,或者您将更改隔离到不会弄脏干净的主线,有时两者都是如此.

变化的方向(你的同事从你那里拉出来或你从你的同事那里拉出来)取决于分支机构预期的风险.将"拉"(合并)更改签入发布分支的风险是多少?查看上面定义的策略,它应该只是错误修正.风险似乎很低.对于大多数发布分支场景,从它们合并到turnk是绝对必要的,因为你必须在从trunk创建下一个release-branch之前手动重新修改bug.

破坏自己宝贵的工作或不得不改变自己的代码的风险有多大,那就是将功能优化的变化合并到你的行李箱结账中?你可以开发新的功能,增强api-call你的同事拥有功能分支决定用一个完全新的实现替换.这可能会扼杀情绪.

豆腐秤

我认为来自perforce的聪明人首先提到了"豆腐"规模.(您可以谷歌或阅读这些幻灯片http://www.perforce.com/perforce/conferences/us/2005/presentations/Wingerd.pdf).

除了每个分支机构的政策外,您还可以估算出它们的"坚定性"以及它们在豆腐规模上的地位.

功能分支是"软"的,因为它处于恒定流量,没有经过良好测试,并且远离任何付费客户的眼睛.因此它也更能够吸收变化.如果事情破裂,你希望他们打破"软"分支.

你的主干将是"中等"的,因为它不是发布准备好的,而是比一些远程功能分支更好的测试.(更不用说因为更多开发人员检查主干而不是功能分支).如果在没有正确集成的情况下在主干中出现巨大的兼容性破坏性变化,它可能会分散开发人员的注意力,但正常大小的签到可以很好地浸泡.

发布分支机构属于"最坚固"的分支机构,因为它们已经完善,经过测试,有时只需几小时即可完成生产使用.如果你打破这片"豆腐片",缝合在一起会更痛苦.另一方面,您可以更好地了解您在此分支机构中所提供的内容以及更高的信心(如果不是单元测试证明)它运行良好.

你应该按照它们在豆腐上的位置来订购树枝.底部柔软,顶部坚固.

  • 标签(非常坚定)
  • 发布-2(公司)
  • 主干(中)
  • feature-apirefactoring(soft)

最好的做法是"合并,复制".

更妙的是"向下合并,复制了稳定状态 "

合并:

  • 在发布-2中的所有提交,您应该尽可能多地合并到主干.(Bugfix-committer应该这样做)
  • 所有提交到主干,包括从发布分支合并下来修复,您应该尽可能多地合并到您的功能分支.(功能所有者应该这样做)

"复制":

  • 当功能分支中的工作完成后"重新集成"它.使用SVN --reintegrate合并或最后一次合并到功能分支中,然后复制所有相关文件. - 强烈建议使用--reintegrate merge.
  • 当您决定是时候稳定主干并快速定位新版本时,您可以将主干分支到新的"版本-3"中.在SVN中,分支是复制,反之亦然.
  • 当您的版本被修复,测试并且运行良好时,您再次复制到新版本标记

最后但并非最不重要的是阅读此最佳实践文档.再次由perforce人;)http://www.perforce.com/perforce/papers/bestpractices.html

搜索stackoverflow或查看我的个人资料,了解更多与SVN相关的问答.

哦,知道你如何成功实现你的合法野心会很好.

周末愉快

C