如何避免在Subversion中进行复杂合并?

8

我是一个Visual Source Safe(VSS)用户,现在学习Subversion(SVN)。在VSS中,编辑文件的人会将其锁定,从而防止其他用户通过Visual Studio编辑它。我了解到SVN是一种并发模型,允许多个人同时编辑同一文件,然后合并更改。我的问题是:

  1. 如何避免多个用户编辑同一文件(编写大量代码),以免在合并更改时出现复杂情况,或者更糟糕的是,发现文件已被其他用户锁定?

  2. 是否有一种方式可以在检索文件时通知用户,该文件当前正在被其他用户编辑或被其他用户锁定?

其他细节:

使用VisualSVN Server作为SVN服务器。
使用TortoiseSVN和AnkhSVN客户端。


感谢大家提供的所有建议和纠正。 - Achilles
虽然有点晚了,但我真的要推荐阅读SVN手册。它以一种随意、实用的方式编写,读起来就像是一个详尽的SO答案。 - Manos Dilaverakis
11个回答

12

我也曾是Visual Source Safe(VSS)的用户。合并操作曾让我抓狂,直到我意识到这不是技术问题,而是人员问题。当使用VSS时,大多数开发人员都会尽可能多地完成工作,然后再检入代码。这种行为导致了复杂的合并操作。

以下是一些缓解此问题的方法:

  • 始终在开始之前更新你的工作副本
  • 经常检入。这将使代码更改变得更小,易于自动合并
  • 不要让未检入的工作代码存留
  • 如果更改需要花费几天或更长时间,开发人员应创建自己的分支

这些方法对我帮助很大,特别是当我所在的团队越来越庞大时。模拟 VSS 的锁定行为是一个非常糟糕的想法,会造成更多的问题。应该接受新的工作流程。

如果你仍想使用工具,则建议你看看SVNMonitor


感谢推荐SVNMonitor。 - Achilles
2
你错过了一个关键的事情,让分支工作变得非常愉快。经常更新...将主干更改合并到你的分支中。就像你在第一点中所说的那样。对于你的分支也要这样做...它不应该被视为与其他分支不同。如果你经常更新你的分支,每天都会有人将主干上的更改合并到你的分支中,你最终不会遇到任何合并问题,因为你的分支中的代码几乎是最新的或接近主干的最新版本,因为你一直在坚持更新你的分支!每天小小的痛苦使生活变得轻松。 - PositiveGuy

8

我建议采用一种不同的方式来使用Subversion。

  • 你应该频繁地获取更新。
  • 你也应该早早地进行检查和提交。

采用这种方法,合并通常不频繁且自动完成。在发生冲突的情况下,这些冲突通常较小。


3
在之前的一家公司,我们从基于锁的系统转移到了SVN。在SVN中,尝试复制锁定-编辑-解锁行为并不是一个好主意,因为它被设计成不需要以这种方式工作。 SVN使用的合并算法非常好,我只遇到过少数几次需要手动干预合并的情况。实际上,两个人同时编辑同一文件的情况非常罕见,而后者通常是唯一需要手动干预的时候。
SVN真正的设计目标是在经常从主干或当前分支更新的环境中使用。如果您需要进行长期工作或对文件中的大量代码进行更改,则最好使用分支来完成工作并将其合并回来。是的,您需要不时地经历一些合并痛苦,但与不设计为以这种方式工作的系统相比,这种痛苦要小得多。
如果您想将SVN用作“非本地SVN”的VSS,那么它将很痛苦,并且不值得麻烦。适应新范式,您会惊讶地发现以这种方式工作比旧的“每次仅有一个用户编辑给定文件”的例程要好得多。

2
首先,如果可能的话,最好避免在未检查文件的情况下编写“大量代码”。如果您拥有一个良好的单元测试套件(如果没有,为什么不呢?:),那么只要您在绿条上提交检查,频繁的提交是最好的。
然后,如果您确实必须进行长时间的更改,定期执行svn update以尽可能与主干保持同步是值得的。Subversion在合并方面表现得相当不错(与VSS相比),并且将处理大部分内容。
它无法处理的任何内容都会处于冲突状态,让您使用自己选择的合并工具解决冲突(我建议使用WinMerge,非常棒)。

2

在处理二进制文件(如MS Word文档)需要进行版本控制,但是SVN无法自动合并多个来源的更改时,唯一可能需要使用旧的VSS样式锁定模型。


1

我会花些时间学习“check in dance”。

这里有一个关于它的dime cast

网络上也有多篇文章介绍如何缓解这种痛苦。


1
不是问题。使用Tortoise SVN,按照以下步骤...
  1. 在Windows资源管理器中右键单击文件。
  2. 选择“Tortoise SVN”,然后选择“Get Lock...”。
  3. 在锁定文件对话框中,填写锁定的原因。
  4. 点击确定。

这是对他问题的技术上正确的回答,但不是解决问题的好方法。当正确使用 SVN 时,很少需要使用锁定。 - nickf
我们已经尝试使用锁定命令,但仍然存在其他用户无法得知文件状态的“问题”。 - Achilles

1
SVN是一种并发模型,允许多人同时在同一文件上工作,然后将更改合并在一起。我认为它更多地涉及在同一项目上工作,该项目由一堆相互独立的文件组成。虽然在同一文件上工作并合并结果当然是可能的,并且偶尔也会发生,但这绝对不是默认/期望的操作模式。因此:
- 经常更新。 - 经常提交。 - 避免大的类/文件(1000行太多了)。这也具有其他好处 :-)

1

尽管SVN有一个lock命令,但使用SVN的最常见方式是采用乐观锁定方法。

这意味着你和我可以编辑同一个文件而不必太担心(大多数情况下我们不会因为我们会在项目的不同部分工作)。如果我首先提交对文件的更改,则您的提交尝试将失败。这就是SVN通知您的时候。

然后,您将需要运行“更新”命令,它将(很可能)自动合并我的已提交更改与您的本地更改,然后您的下一次提交尝试将通过。

为避免出现问题,建议像其他人建议的那样经常提交,并且不要一次提交太多!


0

简短回答:

  1. 经常更新。及早提交,频繁提交。如果您在某个项目上工作时间较长(超过一两天),请考虑创建一个特性分支。
  2. 不。

稍微详细点的回答:

如果有多位开发者对同一个文件进行了“大量修改”,则开发人员工作方式或功能分布在不同文件中的方式可能存在问题。我曾经参与过不同规模的团队使用 CVS 和 SVN 进行开发,我的经验是很少出现合并成为真正问题的情况。(这些通常是基本服务的更改,例如字符串、日志记录、错误处理等,需要更改几乎所有代码。这种情况需要一些人为干预和计划来确保顺利进行。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接