场景:我已经“继承”了一个保存在Mercurial下的程序,该程序仅适用于我的系统,并对已签入的某些文件进行特定调整。我不想检查这些调整英寸
我最近的解决方案是创建一个包含这些调整的mercurial补丁文件(hg diff> patchfile);当我需要检查我的更改时,我将反向应用补丁,提交并重新应用补丁。 (如果我完全控制了源代码,我只是将所有这些小调整移到一个不受版本控制的配置文件中,在版本控制下放置一个“示例”配置文件)
不幸的是,似乎虽然GNU patch
命令支持--reverse
标志,但它不支持hg的多文件diff格式作为单个补丁文件(或者它可能,但我只是不知道它的开关?)。 OTOH,hg有自己的patch
命令可以应用diff,但是它不支持任何类型的reverse
标志。
所以我的问题有两个:
答案 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