【问题标题】:Can Mercurial do a reverse-patch?Mercurial 可以做反向补丁吗?
【发布时间】:2010-11-26 20:38:23
【问题描述】:

场景:我“继承”了一个程序,保留在 Mercurial 下,该程序仅适用于我的系统,对签入的某些文件进行了特定调整。我不想检查这些调整在。

我最近的解决方案是创建一个包含这些调整的 mercurial 补丁文件 (hg diff > patchfile);当我需要检查我的更改时,我只需反向应用补丁、提交并重新应用补丁。 (如果我完全控制了源代码,我只需将所有这些小调整移动到不受版本控制的单个配置文件中,将“示例”配置文件置于版本控制之下)

不幸的是,虽然 GNU patch 命令支持 --reverse 标志,但它似乎不支持 hg 的多文件差异格式作为单个补丁文件(或者它可能支持,我只是不知道它的开关?)。 OTOH,hg 有自己的 patch 命令可以应用差异,但不支持任何类型的 reverse 标志。

所以我的问题是双重的:

  1. 应该在 mercurial 中如何做到这一点?当然,坚持“调整补丁”并不是处理这种情况的唯一方法。也许 mercurial 有一个插件或内置的东西,用于这种临时的、不可提交的更改。
  2. 除了应该怎么做之外,还有什么方法可以将这种反复无常的差异补丁反向应用到这样的反复无常的回购中?在其他情况下,此类功能会很有用。

【问题讨论】:

    标签: mercurial diff patch


    【解决方案1】:

    Mercurial 的patch 命令(真的是import)不支持反向,但hg diff 支持。对此使用--reverse,您将获得一个Mercurial 可以应用的反向补丁。

    但是,您所描述的是一个非常常见的供应商分支风格的工作流程,mercurial 可以更好地支持使用除差异和补丁之外的功能。

    具体来说,Mercurial Queues 完全符合您的要求。

    【讨论】:

    • 这看起来很接近我想要的(我不得不承认我直到现在才努力学习 MQ)。然而,既然我已经将我的补丁添加到 mq 并进行了我想要提交的更改,hg ci 抱怨我“无法提交应用的 mq 补丁”。我也不能在提交之前qpop 补丁,因为仓库中有本地更改。这似乎是一个决定性地阻止 MQ 解决问题的僵局,除非我遗漏了什么。
    • @eternicode:你不能hg commit一个补丁,但你可以hg qfinish它。
    • @robert 再次阅读我的问题。我永远不想提交补丁。我确实想提交我在补丁进入队列后所做的更改,但没有该补丁引入的更改。出于这个原因,似乎 MQ 不是合适的工具。
    • @robert 我看到的问题是,如果不先完成不可提交的补丁,我将无法完成第二个补丁。不过,我发现您可以在.hg/patches/series 文件中交换这些内​​容,这似乎做得很好(尽管整个事情仍然感觉非常手动)。当然,如果补丁 2 的更改依赖于补丁 1 的更改,那么您在执行此操作时要小心,但在我的情况下,它们不会。
    • 你想把你的调整放进去,开始一个新的补丁,然后当你完成后,解除两个补丁,在调整之前重新排列你的永久更改并只重新应用那些,然后完成。 Windows 上的 TortoiseHg 使这更容易一些,但流程相同。
    【解决方案2】:

    我发现--reverse 方法在您有子存储库时不起作用。即

     hg diff --reverse -S
    

    。如果它可以帮助任何人,这个几乎没有经过测试的脚本似乎可以完成这项工作:

    #!/bin/bash
    
    DIRS="$*"
    
    if [[ $DIRS = "" ]]; then
        DIRS=$(echo *)
    fi
    
    for arg in $DIRS; do
        arg=$(echo $arg | sed 's/^\.\/*//g')
        repo=$(echo $arg | cut -d'/' -f-1)
    
        grep -q "^$repo = " .hgsub 2>/dev/null
        if [ $? -eq 0 ]; then
            if [ -d $repo ]; then
                cd $repo
                hg diff --reverse | sed -e "s;--- a;--- a/$repo;g" -e "s;+++ b;--- b/$repo;g"
                cd ..
            else
                echo Error, unknown repo $repo
            fi
        else
            hg diff $arg --reverse
        fi
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多