【问题标题】:In SVN, how to roll back to previous revision instead of merge在 SVN 中,如何回滚到以前的版本而不是合并
【发布时间】:2013-05-12 02:39:31
【问题描述】:

我看过其他类似的帖子和答案。但我的情况更受以下限制:

分支 repo/A 有子分支 repo/B 和 repo/C。 C 将新的 foo.c 推送/合并到 A。然后 B 拉/合并以获取 foo.c,然后推送/合并其他更改。假设 B 的修订在 pull 后从 10 更改为 11。现在分支 B 的一切都搞砸了,所以我希望 B 回到修订版 10 并认为拉动从未发生过。

所以我浏览了那些帖子并想通过以下步骤解决问题:

  1. svnadmin 转储 $(repo/B) -r 0:10 | svnadmin 加载 $(newRepo/B)
  2. 现在我想使用原来的 repo url 所以:

    2.1) 备份以防万一:svnadmin copy $(repo/B) $(repo/B_backup)

    2.2) 复制新的:svnadmin copy $(newRepo/B) $(repo/B);

  3. 现在我希望 UUID 相同,并且我没有 svnadmin setuuid,因为 svn 版本是 1.4。所以:

    3.1)在第1步之前,svn info $(repo/B)记录原始UUID

    3.2)在第 2 步之后,在某处打开 $(repo/B) 的日志,然后将原始 UUID 复制到其中

现在 $(repo/B) 具有修订版 10 和相同的 UUID。

我的问题是

  1. 做完这一切后,分支A和C也会改变吗?

  2. 我的解决方案中是否缺少任何内容,因为我不想再搞砸了?或者更好的方法?

谢谢

【问题讨论】:

  • 不要转储/恢复整个仓库!只需 svn 从 HEAD 中删除 B,然后 svn 从您上一个好的修订版中复制它。
  • 所以你是说即使我只转储/加载 B,整个 A 也会被转储/加载?
  • 好吧,也许我很困惑 - 你有多少个 repos?我假设你有一个 repo,A B 和 C 是 repo 中的文件夹/分支?
  • 好的,所以不要使用svnadmin dump - svnadmin 工具用于整个仓库维护,而不是每天都恢复子树
  • 我发布了一个答案 - 有帮助吗?

标签: svn rollback


【解决方案1】:

您应该简单地删除/复制子树,而不是使用 svnadmin 转储和恢复整个 repo(!):

C:\>svn delete -m "this version went bad" svn://server/repo/B

Committed revision 12.

C:\>svn copy -m "restore good version" svn://server/repo/B@10 svn://server/repo/B

Committed revision 13.

一般情况下,如果可以避免,请不要使用svnadmin。它真的是用于管理任务——而不是像分支/合并/回滚这样的正常源代码控制操作。

【讨论】:

  • 感谢您的建议。如果我按照你的方式做,那么 repo/B 就变成了第 13 版。如果我再次赶上 repo/B,我还能得到 C 之前抛出的 foo.c 吗?
  • 我不确定在这种情况下您所说的“投掷”和“接球”是什么意思。 repo/B 成为第 13 版,但它是第 10 版的精确副本,所以一切都应该完全相同。
  • 好的。现在我有另一个担心:如果在 repo/B 恢复之前,它已经将一些东西(比如说 bar.c)合并到 repo/A。现在 repo/B 恢复到 B 没有将 bar.c 合并到 repo/A 但 repo/A 已经得到 bar.c 的状态。然后它们就不同步了。
  • 我可以删除 repo/A 中的 bar.c,以便下次 repo/B 仍然可以将 bar.c 合并到 repo/A 中吗?
  • 当您恢复 repo/B 时,您没有更改 repo/B 之外的任何文件。如果一个文件从 B 复制到 A,那么该文件仍然是相同的。您可以从 repo/A 中删除 bar.c,然后从 repo/B 中再次复制它?
猜你喜欢
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多