如何创建Mercurial别名实现默认分支两日期间指定文件差异对比
实现Mercurial的diffdates别名(对应CVS diff -D功能)
需求
我们正从CVS迁移至Mercurial,需要创建模拟CVS操作的Mercurial别名,目前缺少对应cvs diff -D <date1> -D <date2> <文件列表>的功能。期望实现hg diffdates <date1> <date2> <文件列表>别名,仅对比default分支上两个日期对应的版本间指定文件的差异。
现有尝试的问题
- 最初尝试的别名
diffdates = diff --from $1 --to $2无法满足需求:多分支场景下会跨分支匹配版本,而非仅在default分支上选取对应日期的版本。 - 后续尝试的shell组合别名:
该别名会忽略日期后的文件参数,导致对比所有文件的差异。diffdates = !$HG diff --from $($HG log -b default -d "<$1" --template "{node}\n" | head -1) --to $($HG log -b default -d "<$2" --template "{node}\n" | head -1) - 尝试用
${@:2}传递后续参数失败,原因是Mercurial会先处理$1、$2等参数再传入shell;后续的多参数写法也无法正确处理带空格的文件名,还限制了文件数量。
解决方案
可以通过sh -c构建完整的shell脚本逻辑,确保参数正确传递,同时处理带空格的文件名,实现需求的别名如下:
diffdates = !sh -c 'FROM_NODE=$($HG log -b default -d "<$1" --template "{node}\n" | head -1); TO_NODE=$($HG log -b default -d "<$2" --template "{node}\n" | head -1); $HG diff --from "$FROM_NODE" --to "$TO_NODE" "${@:3}"' sh
关键说明
- 使用
sh -c包裹脚本逻辑,让Mercurial将所有参数完整传递到shell环境,避免Mercurial提前解析变量导致的参数混乱。 "${@:3}"会保留从第三个参数开始的所有文件路径,双引号包裹确保带空格的文件名被正确识别。-b default限定仅在default分支查找对应日期的版本,避免跨分支匹配。head -1选取符合日期条件的最新版本节点,和CVS中-D参数选取指定日期最新版本的逻辑一致。
内容的提问来源于stack exchange,提问作者Digit Cruncher
相关产品推荐
相关产品推荐

