Mercurial能够进行反向补丁吗?

12

情景: 我接手了一个由Mercurial保存的程序,只有在对某些已检入文件进行特定修改后才能在我的系统上运行。我不想将这些修改检入。

解决办法是创建一个Mercurial补丁文件(hg diff > patchfile),其中包含这些修改; 在需要提交更改时,我将反向应用该补丁,提交并重新应用该补丁。(如果我完全控制源代码,我会将所有这些小的修改移动到一个不受版本控制的单个配置文件中,在版本控制下放置一个“示例”配置文件)

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

所以我的问题有两个:

  1. 在Mercurial中应该如何处理此类情况?肯定保留“调整补丁”不是唯一的方法。也许Mercurial有一个插件或内置功能来处理这种临时的不可提交更改。
  2. 除了应该如何处理之外,是否有任何方法可以将这样的Mercurial差异补丁反向应用到像这样的Mercurial存储库中?还有其他情况下会用到这种功能。
2个回答

23

Mercurial的patch命令(实际上是import)不支持反转,但是hg diff支持。在那里使用--reverse,你将得到一个反转的补丁,Mercurial可以应用它。

然而,您所描述的是一种非常常见的供应商分支样式工作流程,Mercurial可以更好地支持使用除了diff和patch之外的其他功能。

具体来说,Mercurial Queues正是您想要的。


这看起来接近我想要的(我必须承认我从未努力学习 MQ)。但是,现在我已经将补丁添加到 mq 并进行了更改后,当我想提交时,“hg ci”会抱怨“无法在应用 mq 补丁上提交”。我也无法在提交之前 qpop 补丁,因为存储库中有本地更改。除非我漏掉了什么,否则这似乎是一个阻碍解决问题的难题。 - eternicode
@eternicode:你不能使用 hg commit 提交一个补丁,但是你可以使用 hg qfinish 完成它。 - robert
@robert 请再次阅读我的问题。我不想提交补丁。我确实想在补丁进入队列后提交我所做的更改,但不包括该补丁引入的更改。看起来MQ并不是这个问题的正确工具,正因为如此。 - eternicode
@eternicode:在初始补丁的基础上创建一个新的补丁,然后完成它。 - robert
1
@robert 我看到的问题是,如果我不先完成无法提交的补丁,我就无法完成第二个补丁。但是我发现,你可以在.hg/patches/series文件中交换它们的顺序,这似乎很好地解决了问题(尽管整个过程仍然感觉非常手动)。当然,如果第二个补丁的更改依赖于第一个补丁的更改,那么你需要小心处理这个问题,但在我的情况下,它们并没有相互依赖。 - eternicode
2
你想要加入自己的调整,开始一个新的补丁,然后当你完成时,提取两个补丁,将永久更改重新排序放在调整之前,然后只重新应用那些更改,最后完成提交。在Windows上使用TortoiseHg可以使这个过程变得更容易,但流程是相同的。 - Binary Phile

1

我发现当存在子仓库时,使用-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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接