如何避免Subversion中的复杂合并?

时间:2009-11-12 14:32:28

标签: svn version-control tortoisesvn ankhsvn

我是来自Visual Source Safe(VSS)背景的Subversion(SVN)新手。在VSS中,编辑文件的人检查文件,并锁定其他用户通过Visual Studio编辑它。我知道SVN是一个并发模型,允许多个人在同一个文件上工作,然后将更改合并在一起。我的问题是:

  1. 避免让用户编辑同一个文件(写入大量代码和大量代码)的最佳方法是什么,要么面对复杂的合并进行更改,要么更糟糕的是编写大量代码才能找到该文件被其他用户锁定?

  2. 有没有办法在检索当前正被其他用户编辑或当前被其他用户锁定的文件时通知用户?

  3. 其他细节:

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

11 个答案:

答案 0 :(得分:12)

我也是以前的Visual Source Safe用户。 Merges曾经让我发疯,直到我意识到这不是一个技术问题,而是一个人的问题。使用VSS时,大多数开发人员在必须检查代码之前尝试尽可能多地完成工作。此行为是导致复杂合并的原因。

以下是一些可以缓解此问题的事情:

  • 在开始之前始终更新您的工作副本
  • 经常入住。这将使代码更改更小,这将更容易自动合并
  • 不要取消选中工作代码
  • 如果更改需要几天或更长时间,开发人员应创建自己的分支

这些事情帮助极大,尤其是我工作的团队越来越大。从VSS复制锁定行为是一个非常糟糕的主意,并且会导致更多问题。只需拥抱新的工作流程。

如果您仍想使用工具,我建议您查看SVNMonitor

答案 1 :(得分:8)

我建议采用不同的方法来使用subversion。

  • 您应该经常获得更新。
  • 你也应该尽早办理入住手续。

使用这种方法,合并通常很少发生并自动发生。在冲突的情况下,这些往往更小。

答案 2 :(得分:3)

我之前在从基于锁的系统转到SVN的地方遇到了几点。

尝试在SVN中复制锁定编辑解锁行为并不是一个好主意,因为它的设计方式使您不需要以这种方式工作。 SVN使用的合并算法非常好,我只遇到过一些需要在合并期间进行手动干预的事件。令人惊讶的是,在同一个文件上工作的两个人实际上会触摸相同的线路,而后者通常是需要手动干预的唯一时间。

SVN实际上设计用于经常从主干或当前分支更新的环境。如果你必须做更长期的工作或改变文件中的大量代码的工作,你可能最好使用分支来完成工作并将其合并回来。是的,你将不得不经历一些合并不时会有痛苦,但是这种痛苦远远超过了那种不能以这种方式工作的系统。

如果您尝试将SVN用作“原生SVN”,而不是使用具有不同名称的VSS,则会很痛苦并且不值得麻烦。对新范例感到满意,与旧的“只有一个用户在任何给定时间编辑给定文件”例程相比,你会惊讶地发现这种方式更好。

答案 3 :(得分:2)

首先,如果可能的话,最好不要在不检查文件的情况下编写“吨和大量代码”。如果你有一个好的单元测试套件(如果没有,为什么不呢?:),那么只要你在绿色条上签到,频繁提交是最好的。

然后,如果您确实需要花费很长时间进行更改,那么定期进行svn update定期与主干保持同步是值得的。 Subversion在合并方面非常值得尊敬(与VSS相比),并且可以很好地处理大部分内容。

任何它无法处理的东西,都会处于冲突状态,让你用你选择的合并工具解决冲突(我建议WinMerge为此,这是王牌)。

答案 4 :(得分:2)

您可能希望使用旧的VSS样式锁定模型的唯一时间是您想要版本的二进制文件(MS-Word文档等),但SVN无法自动合并来自多个源的更改。

答案 5 :(得分:1)

我会花些时间了解“入场舞会”

这里有一个dime cast

网上还有很多关于此事的文章,以及如何减轻痛苦。

答案 6 :(得分:1)

不是问题。使用Tortoise SVN,这样做......

  1. 在Windows资源管理器中,右键单击 文件(多个)。
  2. 选择“Tortoise SVN”,然后选择“Get 锁定......“
  3. 在“锁定文件”对话框中,填写 在你解锁的原因中。
  4. 单击“确定”。

答案 7 :(得分:1)

  

SVN是一个并发模型,允许多人处理同一个文件,然后将更改合并在一起。

我认为更多的是关于同一个项目的工作,它由一堆或多或少的独立文件组成。处理同一个文件并合并结果肯定是可能的,并且偶尔会发生,但它绝对不是默认/所需的操作模式。所以:

  • 经常更新。
  • 经常提交。
  • 避免使用大型类/文件(1000行太多了)。这还有其他好处: - )

答案 8 :(得分:1)

虽然SVN有一个 lock 命令,但最常用的SVN方法是采用乐观的锁定方法。

这意味着你和我可以编辑同一个文件而不用担心它(大部分时间我们不会因为我们正在处理项目的不同部分)。如果我是第一次提交对文件的更改,那么您的提交尝试将失败。那时SVN会通知你。

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

为了避免遇到这种乐观方法的麻烦:正如其他人所说的那样,经常提交并且不会立刻提交太多!

答案 9 :(得分:0)

简短回答:

  1. 经常更新。早点检查,经常检查。如果您处理更长时间(超过一天或两天)的事情,请考虑创建一个功能分支。
  2. 否。
  3. 更长的答案:

    如果多个开发人员在同一个文件上进行了“大量的变更”,那么无论是开发人员的工作方式还是功能分布在不同文件上的方式,都会出现问题。我一直在使用不同大小和IME的团队中的CVS和SVN,当合并成为一个真正的问题时,很少有案例。 (这些通常是基本服务的变化,如字符串,日志记录,错误处理等,需要更改所有代码。这种情况需要一些人工交互和计划顺利进行。)

答案 10 :(得分:0)

我同意其他所有人的意见,尽可能提早入住(经常 )。如果你正在做一些复杂和新的事情,它可以在一个分支上完成 - 同样的规则适用,提前和经常提交,并保持你的分支与头部代码一样实用。

根据我们的经验,大多数人不会同时处理同一文件或文件的至少相同部分(在VSS中你无法所以你的工作模式可能已经支持你了。)

还有一个关键的事情 - 确保每个人都使用相同的规则来使用标签/间距,布局和格式化,这无论如何都是好的做法,但是你越不一致就越不可能找到“差异” “在真正不存在的代码文件之间。

此外,我建议你看看持续集成,即拥有一个构建服务器,这可以提供相当大的好处,使你的承诺代码能够在一个“干净”的环境中构建,如果你配备了适当的测试,即使在复杂的合并过程之后,它仍然会给你更多信心,它仍然有效。

我们使用TeamCity我们发现它们非常出色 - 但还有其他人。