使用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格式(推荐)
这是最省心的长期方案,让标签完全符合工具的默认识别逻辑:
- 先删除不符合规范的旧标签(如果不需要保留的话):
git tag -d Release-v.-2.3.1 # 如果已经推送到远程,还要执行:git push origin :refs/tags/Release-v.-2.3.1 - 重新打标准格式的标签:
git tag v2.3.1 <对应提交哈希> git push origin v2.3.1 - 之后直接运行你的原脚本(可以去掉
-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这种标签格式,可以通过配置文件让工具识别它:
- 在项目根目录创建
changelog.config.js文件,内容如下:module.exports = { tagPrefix: 'Release-v.-', // 指定你的标签前缀 releaseCount: 1 // 只生成最近一个版本的变更 }; - 修改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

