【问题标题】:Fixing renames in a Mercurial repository after committing提交后修复 Mercurial 存储库中的重命名
【发布时间】:2013-07-30 12:49:29
【问题描述】:

我们的 Mercurial 存储库中的许多文件在一次提交中被移动,但这些文件没有被标记为重命名。更糟糕的是,一些文件也在同一次提交中被修改了。

如何在保持更改和文件移动的同时,撤销变更集并正确检测重命名?

【问题讨论】:

    标签: mercurial rename tortoisehg backout


    【解决方案1】:

    历史编辑(又名 MQ 中的乱七八糟)有一个替代方法来修复重命名。手动过程概述为 here 作为 fixrenames 扩展使用的逻辑。

    手动流程如下。对于没有标记重命名的每个修订版本 N:

    $ hg update n-1
    $ hg revert --all --rev n
    $ hg addremove -s 70
    $ hg commit -m "Fix renames from n"
    $ hg merge n
    

    请注意,相似性标志有时需要摆弄。原因是重命名几乎从来都不是纯粹的重命名。例如,重命名一个类需要更改文件以及更改文件名。因此,它们不是 100% 相同的。您必须查看 addremove 的功能,并确保添加的文件被标记为“X(从 Y 重命名)”。

    通过这种方式,您无需大量手动工作即可恢复完整的历史记录。我今天必须这样做(不使用 fixrenames 扩展),我花了大约 5 分钟来修复。

    您甚至可以在需要修复堆叠变更集的情况下应用此过程。

    变更集图表如下所示。考虑变更集 A、B、C 和 D。B 和 D 的重命名不正确:

    D
    |
    C
    |
    B
    |
    A
    

    首先我们更新到 A,对 B 进行就地还原,执行 addremove 并作为 E 提交。然后我们将 C 合并到 E 作为 F,因为 C 没有任何问题。您应该会看到如下内容:

    F D
    |\|
    | C
    | |
    E B
    |/
    A
    

    现在对 D 应用相同的内容。我们更新到 F,从 D 恢复,添加删除并提交到 G。现在我们只需合并以关闭额外的头。您应该会看到如下内容:

    H
    |\
    G |
    | |
    F D
    |\|
    | C
    | |
    E B
    |/
    A
    

    如果你想说服自己这行得通,你可以随时

    hg diff -r D -r H
    

    根据您的工具,您会看到列出的文件没有差异或重命名但它们之间没有差异。

    【讨论】:

    • 命令行显示hg merge n,但图表显示与n+1合并?
    【解决方案2】:

    MrFox 答案的自动版本

    1. 将“坏”变更集的更改导出到补丁文件(可能是 git 格式)或保存到捆绑包或将其转换为 MQ 补丁
    2. 将工作目录更新到错误变更集的父级
    3. 应用补丁|导入包
    4. 在修改后的工作目录中使用hg addremove -s NN来检测重命名(NN必须手动找到,所有重命名都必须在结果中检测到),用hg status -C检查猜测的结果,重复adremove直到正确的结果不会收到
    5. 提交新的良好变更集

    【讨论】:

      【解决方案3】:
      1. 列出对文件所做的所有修改。
      2. 更新回未移动文件的版本。
      3. 重命名文件。
      4. 根据需要修改文件内部结构。
      5. 提交。

      【讨论】:

      • 列出所有修改,恢复到预先更改,然后手动更新每个文件似乎是最手动的方法。我希望有一种更自动化、更简单的方法。
      • Mercurial 不知道您的更改需要如何不同。没有“替换名称与重命名这些文件相似的已删除和添加的文件”。 Git在这里会更好,它会查看内容,并且可能会建议您更改文件名或其他内容,而不是删除和添加文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 2013-01-03
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多