多人项目的SVN补丁/差异管理

时间:2012-03-29 20:06:43

标签: linux svn diff patch

我通常从事小型项目,只涉及2-3个人同时在同一个代码库上工作。

对我来说,通常的例行程序如下:

  1. 搜索错误报告,按优先级选择错误并编写修复
  2. 创建一个diff / patch(让我们称之为补丁“alpha”)代码库的更改(即:svn diff>〜/ diff_alpha.patch)
  3. 通过电子邮件将补丁发送给同事,他们可以直观地检查代码库中的差异并指出错误或建议
  4. 他们告诉我需要进行哪些更改,我将其放入,然后使用修改后的补丁重新发送给我的团队
  5. 一旦大家都同意补丁是好的,我会将它应用到代码库中,在必要时合并其他人的更改,重新构建,重新测试和提交。
  6. 这里的问题是我通常需要等待几天才能获得修改后的最终补丁的所有批准,在此期间我(显然)想要处理其他补丁。

    如果我继续处理另一个bug,它会影响我在上一个补丁中处理的同一个文件,这意味着当我想提交之前的补丁(alpha)时,我必须:

    1. 通过svn diff>将我当前的工作备份到新的补丁(即:补丁“bravo”)。 〜/ diff_的喝彩 .patch
    2. 还原我当前的工作副本(svn revert -R。)
    3. 应用旧补丁(补丁-p0<〜/ diff_ alpha .patch)
    4. 提交旧补丁(svn commit)
    5. 应用我之前正在处理的补丁(补丁-p0<〜/ diff_ bravo .patch)
    6. 继续处理与diff_bravo.patch相关的代码
    7. 这很烦人,因为我通常不得不在diff_alpha和diff_bravo之间手动合并冲突。

      我尝试的另一种方法是继续我的diff_alpha工作而不创建diff_bravo。然后,当我批准通过电子邮件发送的原始diff_alpha中的所有代码时,我会执行以下操作:

      1. 通过svn diff>将我当前的工作备份到新的补丁(即:补丁“temp”) 〜/ diff_的温度 .patch
      2. 还原我当前的工作副本(svn revert -R。)
      3. 应用旧补丁(补丁-p0<〜/ diff_ alpha .patch)
      4. 提交旧补丁(svn commit)
      5. 应用我之前正在处理的补丁(补丁-p0<〜/ diff_ temp .patch)
      6. 现在我可以继续我正在做的事情,而不必手动合并,但是我会在我的“patch”命令中收到大量的失败,因为diff_temp中的一半代码已经在diff_alpha中提交了。我认为这不可接受。
      7. 有关处理公共文件上的多个任务/错误的任何建议,以便最大限度地减少SVN冲突吗?

2 个答案:

答案 0 :(得分:3)

这就是分支机构的用途。您为每个错误创建一个分支并在该分支中工作,直到您准备好与您的团队成员协商。团队成员可以检查分支并进行检查(进行新更改时更新)。当每个人都同意时,将分支合并回主干。

团队成员可以检查您对分支所做的每项更改的日志(实际上是您的问题中的补丁),或者打开已更改的文件并查看上下文中应用的更改(他们甚至可以访问以前的版本)文件以查看更改之前的情况。)

您仍然需要提醒您的团队成员检查更改,但不必明确地向他们发送更改 - 他们将从中心存储库中获取更改。

您可以拥有多个分支(每个bug一个),并且可以同时处理它们。合并到主干时,SVN应自动进行合并(偶尔指出冲突,你可以手动解决。

冲突可能是因为分支是从旧版本的trunk创建的,而当前的trunk状态(包含其他分支的一些更改)与当前分支的更改冲突。你有意义地手动解决它们。重新测试以确保一切都很好。

更新:根据Lazy Badger的评论,您的团队成员可以提交提交监视器,以便在您对(特定)分支进行更改时提醒他们。

答案 1 :(得分:2)

当我们工作时,我们会在提交后进行大部分代码审查。这些补丁文件都没有来回传递。我们使用Jenkins并拥有可以为我们进行大量检查的插件(如Findbugs,PMD,CheckStyle等)。如果我们发现问题,我们可以在新的提交中修复它们。如果变化很糟糕,我们可以将其还原。

如果您喜欢当前的工作流程,可能需要查看Git,它允许您在开发人员之间轻松共享这样的补丁。这是Git如此受欢迎的原因之一。

我还有一个用于Subversion的 Commit Monitor 插件(真正的提交后挂钩),允许人们根据他们想要通知的更改来设置自己的首选项。配置存储在存储库中,因此用户可以访问它。