2010-11-26 28 views
8

场景:我已经“继承”的程序,保持水银下,只有我的工作与特定的调整,以某些文件,这些文件在签系统上我要签这些调整可以Mercurial做反向修补吗?

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

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

所以我的问题是双重的:

  1. 如何应该这将在水银做了什么?当然挂在“调整补丁”并不是处理这种情况的唯一方法。也许mercurial有一个插件或内置的这种暂时的,不可改变的变化。
  2. 除了应该怎么做,有什么办法可以将这样一个mercurial diff-patch应用到这样的mercurial repo吗?还有其他情况下,这些功能将是有用的。

回答

19

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

然而,你所描述的是一个非常命令供应商分支风格的工作流程,mercurial可以更好地支持使用diff和patch之外的其他功能。

特别地,Mercurial Queues完全符合你的要求。

+0

这接近我想要的(我必须承认,我从来没有把学习MQ努力到现在为止)。然而,现在我已经将我的补丁添加到mq中并且做出了我想提交的更改,“hg ci”抱怨说我“无法承诺应用的mq补丁”。在提交之前,我不能'补丁'补丁,因为补丁中有本地更改。这似乎是一个阻碍MQ解决问题的障碍,除非我错过了一些东西。 – eternicode 2010-11-26 22:58:41

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