You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用conventional-changelog-cli更新CHANGELOG时旧提交重复出现的问题求助

问题根源分析

你的问题核心在于conventional-changelog-cli默认只会识别符合语义化版本(SemVer)规范的标签,也就是类似vX.Y.Z这种格式的标签。

你当前的最新标签是Release-v.-2.3.1,这个格式不符合工具的默认识别规则;而v2.1.0-in-test-environments虽然带有后缀,但开头是v+版本号的结构,被工具判定为有效的“上一个版本标签”,所以生成CHANGELOG时,它会从v2.1.0-in-test-environments开始对比到当前HEAD,自然就混入了大量旧提交。

另外,你的脚本里的-r参数其实是指定生成的版本条目数量(默认是1),这里不是导致问题的直接原因,但可以去掉避免混淆。

解决办法

根据你的需求,有三种可选方案:

方案一:修改标签为标准SemVer格式(推荐)

这是最省心的长期方案,让标签完全符合工具的默认识别逻辑:

  1. 先删除不符合规范的旧标签(如果不需要保留的话):
    git tag -d Release-v.-2.3.1
    # 如果已经推送到远程,还要执行:git push origin :refs/tags/Release-v.-2.3.1
    
  2. 重新打标准格式的标签:
    git tag v2.3.1 <对应提交哈希>
    git push origin v2.3.1
    
  3. 之后直接运行你的原脚本(可以去掉-r参数):
    "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s && git add CHANGELOG.md"
    

工具会自动识别最新的v2.3.1作为上一个版本,只生成从该标签到当前HEAD的变更内容。

方案二:手动指定对比范围(不修改现有标签)

如果不想改动现有标签,可以在脚本中通过--from和--to参数强制指定对比的标签范围:
修改package.json中的脚本为:

"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s --from Release-v.-2.3.1 --to HEAD && git add CHANGELOG.md"

这样工具会严格只对比Release-v.-2.3.1到当前HEAD的提交,不会再错误选择旧标签。

方案三:自定义标签识别规则(适配现有标签格式)

如果你需要长期使用Release-v.-X.Y.Z这种标签格式,可以通过配置文件让工具识别它:

  1. 在项目根目录创建changelog.config.js文件,内容如下:
    module.exports = {
      tagPrefix: 'Release-v.-', // 指定你的标签前缀
      releaseCount: 1 // 只生成最近一个版本的变更
    };
    
  2. 修改package.json中的脚本,引入这个配置文件:
    "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -n changelog.config.js && git add CHANGELOG.md"
    

之后工具就会自动识别以Release-v.-为前缀的标签,找到最新的Release-v.-2.3.1作为对比起点。

验证步骤

在正式写入CHANGELOG前,你可以先预览生成的内容,确保没有旧提交:

conventional-changelog -p angular --from Release-v.-2.3.1 --to HEAD -o -

这个命令会将生成的变更内容输出到控制台,确认无误后再运行脚本写入文件。

内容的提问来源于stack exchange,提问作者Lirianna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:21:47