Mercurial可以做反向补丁吗?

时间:2010-11-26 20:38:24

标签: mercurial diff patch

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

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

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

所以我的问题有两个:

  1. 应如何在mercurial中完成此操作?当然,坚持使用“调整补丁”并不是处理这种情况的唯一方法。也许mercurial有一个插件或内置的东西,用于这种暂时的,不可承认的变化。
  2. 除了应该如何完成之外,有没有办法将这样的mercurial diff-patch反向应用到这样的mercurial repo?在其他情况下,此类功能将非常有用。

2 个答案:

答案 0 :(得分:21)

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

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

具体而言,Mercurial Queues完全符合您的要求。

答案 1 :(得分:1)

我发现 - 当你有子回购时,反向方法不起作用。即。

 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
相关问题