Mercurial:如何修改默认标签消息模板?多方案尝试未生效
解决Mercurial标签提交消息模板不生效的问题
你的尝试之所以没效果,是因为对Mercurial的配置逻辑理解有误,具体问题和修复方法如下:
你之前操作的问题点
[committemplate]配置无效:changeset.tag是日志展示模板,仅控制hg log等命令显示标签变更集的格式,不会修改实际存储的提交消息内容。- 命令行
-m参数不解析模板变量:hg tag -m传入的是固定字符串,Mercurial不会自动替换其中的{tag}、{node|short}这类模板占位符,它们会原样出现在提交消息里。
正确的解决方案
方案1:用pretag钩子自动生成规范消息
在仓库的.hg/hgrc文件中添加pretag钩子,通过脚本动态生成符合要求的提交消息。
Python钩子(跨平台通用)
[hooks] pretag = python: from mercurial import node import datetime # 获取当前变更集上下文、标签名 ctx = repo[rev] tag_name = tag short_node = node.short(ctx.node()) # 转换时间为ISO格式 timestamp = ctx.date()[0] date_str = datetime.datetime.fromtimestamp(timestamp).isoformat(' ', timespec='seconds') # 构造基础消息 base_msg = f"TAG: Added tag {tag_name} for {short_node} created on {date_str}\n" # 如果用户通过-m传入了自定义描述,追加到消息末尾 if opts.get('message'): base_msg += opts['message'] # 替换原消息 opts['message'] = base_msg
Shell钩子(Linux/macOS适用)
[hooks] # 生成基础消息,覆盖默认消息 pretag = echo "TAG: Added tag $HG_TAG for $(hg id -i -r $HG_NODE) created on $(date -Iseconds)" > $HG_MESSAGE # 若需要保留用户传入的自定义描述,改用下面的命令 # pretag = (echo "TAG: Added tag $HG_TAG for $(hg id -i -r $HG_NODE) created on $(date -Iseconds)"; cat $HG_MESSAGE) > $HG_MESSAGE.tmp && mv $HG_MESSAGE.tmp $HG_MESSAGE
方案2:使用--message-template参数(Mercurial 5.3+)
从Mercurial 5.3版本开始,tag命令支持--message-template参数,可直接解析模板变量生成消息:
hg tag -r . --message-template "TAG: Added tag {tag} for {node|short} created on {date|isodate}\n{desc}" test4
这个参数会自动替换占位符,生成你需要的格式。
额外:让打标签时自动打开编辑器
如果需要打标签时默认打开编辑器补充描述,在.hg/hgrc中配置编辑器:
[ui] editor = vim # 替换为你常用的编辑器,比如code、subl等
这样未通过-m指定消息时,Mercurial会自动打开编辑器,方便你添加自定义内容。
内容的提问来源于stack exchange,提问作者Russ Thils
相关产品推荐
相关产品推荐

