0

AI CHANGELOG生成工具免费推荐:6款把Git提交一键变成版本发布说明的神器横向对比与实操指南

2026.08.05 | youres | 61次围观

发版前一小时,你是不是还在翻 git log,手动把几十条提交记录拼成一份能给用户看的更新说明?漏了重要修复、写了一堆"优化代码结构"这种废话、版本号还敲错了——这几乎是每个团队都踩过的坑。其实这件事早就可以完全交给工具:从提交记录里自动提取变更、自动分类、自动算版本号、自动写进 CHANGELOG.md 并发布 Release。

这篇文章横向对比 6 款免费的 AI CHANGELOG 生成工具(含开源自动化方案与大模型提示词方案),每一款都给出真实可跑的命令和配置,并在最后给出一条"照着做就能接上"的落地路径。

一、先看结论:6 款工具速览

工具类型最适合是否免费上手难度
git-cliffRust 命令行任何语言的项目,想要高度自定义模板完全开源免费★★☆☆☆
release-pleaseGitHub ActionGitHub 仓库,想要全自动发版 PR完全开源免费★★☆☆☆
semantic-releaseNode 插件体系npm 包、需要严格语义化版本完全开源免费★★★★☆
conventional-changelog-cliNode 命令行老项目补 CHANGELOG,最小改动完全开源免费★☆☆☆☆
changesetsNode 工作流monorepo 多包独立发版完全开源免费★★★☆☆
大模型提示词方案DeepSeek / 通义灵码等把机器日志改写成"人话版"发布说明有免费额度★☆☆☆☆

一句话选型:只想快速有个 CHANGELOG → conventional-changelog-cli;想要长期自动化 → git-cliff 或 release-please;monorepo → changesets;想让发布说明读起来像人写的 → 在前面任意方案后面接一层大模型改写。

二、六款工具逐个拆解

1. git-cliff:模板自由度最高的通用方案

git-cliff 是用 Rust 写的 CHANGELOG 生成器,不绑定任何语言生态,Go、Python、Java、PHP 项目都能用。它的核心是一个 cliff.toml 配置文件,用 Tera 模板语法控制输出格式,想生成 Markdown、HTML 还是纯文本都行。

安装与最小可用命令:

# 方式一:Cargo 安装
cargo install git-cliff

# 方式二:npm 安装(无需 Rust 环境)
npm install -g git-cliff

# 初始化配置文件
git cliff --init

# 生成全量 CHANGELOG
git cliff -o CHANGELOG.md

# 只生成未发布部分(最常用)
git cliff --unreleased --tag v1.4.0 --prepend CHANGELOG.md

配置片段示例(cliff.toml 里控制分组规则):

[git]
conventional_commits = true
filter_unconventional = true
commit_parsers = [
  { message = "^feat", group = "新增功能" },
  { message = "^fix", group = "问题修复" },
  { message = "^perf", group = "性能优化" },
  { message = "^docs", group = "文档更新" },
  { message = "^chore", skip = true },
]

优点:跨语言、模板自由、支持 --unreleased 增量生成、可直接在 CI 里跑。局限:模板语法需要花半小时熟悉,默认输出偏"工程味"。

2. release-please:GitHub 上最省心的全自动方案

release-please 由 Google 维护,工作方式很聪明:它常驻监听你的主分支,一旦发现符合规范的提交,就自动开一个"Release PR",PR 里已经写好了新版本号和更新后的 CHANGELOG.md。你觉得没问题就合并,合并瞬间自动打 tag、发 GitHub Release。

GitHub Actions 配置:

name: release-please
on:
  push:
    branches: [ main ]
permissions:
  contents: write
  pull-requests: write
jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: googleapis/release-please-action@v4
        with:
          release-type: node   # 也支持 python / go / java / php 等

优点:零维护、版本号自动推导、发布记录留在 PR 里可追溯,团队协作场景体验最好。局限:强依赖 GitHub,且提交信息必须守规范,否则它"看不见"你的改动。如果团队还没统一提交格式,建议先看看 AI Git提交信息生成工具免费推荐,用工具把规范先落下来。

3. semantic-release:把发版整条链路全部自动化

semantic-release 的野心更大:它不只生成 CHANGELOG,而是把「分析提交 → 决定版本号 → 生成发布说明 → 发布到 npm → 创建 Git tag → 更新 GitHub Release」整条链路一次跑完,人工完全不介入。

npm install -D semantic-release \
  @semantic-release/changelog \
  @semantic-release/git

# .releaserc.json
{
  "branches": ["main"],
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    "@semantic-release/changelog",
    "@semantic-release/npm",
    "@semantic-release/git"
  ]
}

优点:彻底消灭"忘记改版本号"这类人为失误。局限:插件链较长、首次配置成本高,而且它默认"每次合并就发版",对节奏慢的项目反而是负担。建议先在 CI 里做好流水线基础,可参考 AI CI/CD流水线配置生成工具免费推荐

4. conventional-changelog-cli:老项目补作业的最小成本选择

如果你只是想"现在立刻有一份 CHANGELOG",不想改 CI、不想动发版流程,那这个是最快的:

# 只生成最近一个版本的变更,追加到文件头部
npx conventional-changelog -p angular -i CHANGELOG.md -s

# 首次使用,重新生成全部历史(-r 0 表示全量)
npx conventional-changelog -p angular -i CHANGELOG.md -s -r 0

优点:一条命令、零配置、可随时手动跑。局限:纯规则匹配,不规范的历史提交会被直接丢掉;不管版本号,也不发 Release。

5. changesets:monorepo 多包发版的正解

在一个仓库里管着十几个包时,前面几款工具会遇到同一个问题:一次提交到底该给哪个包升版本?changesets 的解法是让开发者在提 PR 时顺手写一个 changeset 文件,声明"我改了哪些包、属于什么级别的变更"。

npx changeset init
npx changeset            # 交互式选择包与版本级别,生成 .changeset/xxx.md
npx changeset version    # 消费所有 changeset,更新版本号与各包 CHANGELOG
npx changeset publish    # 发布

优点:多包依赖关系自动联动升级,变更说明由改动者本人写,质量最高。局限:需要团队养成写 changeset 的习惯,单包项目属于杀鸡用牛刀。

6. 大模型提示词方案:把机器日志翻译成"人话"

前面五款工具解决的是"自动化",但它们输出的仍然是提交信息原文,用户读到的可能是 fix: correct null pointer in OrderService 这种东西。真正给用户看的发布说明,需要再加一层改写。做法很简单:把 git log 结果丢给 DeepSeek、通义灵码、Kimi 这类工具,用一段固定提示词转换。

# 先导出结构化日志
git log v1.3.0..v1.4.0 --pretty=format:"%s (%an)" --no-merges > commits.txt

可直接复用的提示词模板:

你是一名产品发布说明撰写者。下面是本次版本的 Git 提交记录。请按「新功能 / 体验优化 / 问题修复 / 开发者相关」四个分组整理,要求:
1. 用普通用户能看懂的语言,不出现类名、函数名、变量名;
2. 每条不超过 30 字,说清"用户能感知到什么变化";
3. 合并重复项,纯重构与依赖升级归入"开发者相关"并压缩成一句;
4. 输出 Markdown,不要额外解释。
提交记录如下:{{粘贴 commits.txt}}

优点:零成本、任何工具链都能接。局限:需要人工复核,模型偶尔会夸大或臆造功能点。想让提示词更稳定,可以参考 AI SDK生成工具免费推荐 里提到的"结构化输入 + 固定输出格式"思路。

三、横向对比:到底怎么选

能力维度git-cliffrelease-pleasesemantic-releaseconventional-changelogchangesets
跨语言支持✅ 任意✅ 多语言⚠️ 偏 Node⚠️ 偏 Node⚠️ 偏 Node
自动推导版本号
自动发布 Release⚠️ 需配合 CI
模板自定义能力✅ 最强⚠️ 有限⚠️ 靠插件⚠️ 预设风格⚠️ 有限
monorepo 友好度⚠️ 一般✅ 支持⚠️ 需额外配置✅ 最强
接入成本极低

三条决策路径:

  • 个人项目 / 非 Node 项目:git-cliff 一把梭,配好 cliff.toml 后每次发版一条命令搞定。
  • 团队 GitHub 仓库:release-please + Conventional Commits,合并 PR 即发版,几乎零维护。
  • 多包仓库:changesets,谁改谁写,发布说明质量最高。

四、实操:15 分钟给项目接上自动 CHANGELOG

以最通用的 git-cliff 方案为例,完整走一遍。

第一步:统一提交规范

所有自动化方案的地基都是 Conventional Commits,格式为 type(scope): subject。常用 type 速查:

type含义是否进 CHANGELOG版本影响
feat新增功能MINOR +1
fix问题修复PATCH +1
perf性能优化PATCH +1
refactor重构(无行为变化)可选
docs / test / chore文档、测试、杂项通常否
BREAKING CHANGE不兼容变更(正文中声明)是,置顶MAJOR +1

第二步:加一道提交格式校验

npm install -D @commitlint/cli @commitlint/config-conventional husky
echo "module.exports = { extends: ['@commitlint/config-conventional'] }" > commitlint.config.js
npx husky init
echo "npx --no -- commitlint --edit \$1" > .husky/commit-msg

这一步很关键:不校验的话,三个月后你的提交历史里会混进大量 updatefix bug,自动化就成了摆设。

第三步:初始化并生成

git cliff --init
git cliff -o CHANGELOG.md          # 首次全量
git add CHANGELOG.md && git commit -m "docs: 初始化 CHANGELOG"

第四步:接进 CI,发版自动更新

name: changelog
on:
  push:
    tags: [ 'v*' ]
jobs:
  changelog:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }
      - uses: orhun/git-cliff-action@v4
        with:
          args: --latest --strip header
        env:
          OUTPUT: RELEASE_NOTES.md

注意 fetch-depth: 0——这是最高频的踩坑点,默认浅克隆拿不到历史提交,生成结果会是空的。

第五步:加一层人话改写

把生成的 RELEASE_NOTES.md 丢给大模型,用第六节的提示词转成用户可读版本,作为对外公告发布。到这一步,整个流程就闭环了:开发者只管按规范提交,剩下的全自动。

五、五个最容易踩的坑

  1. CI 浅克隆导致输出为空。checkout 时务必设置 fetch-depth: 0,让工具能看到完整提交历史与 tag。
  2. tag 命名不统一。v1.0.01.0.0 混用会让版本区间识别失败,选一种就固定下来。
  3. squash merge 丢失细节。PR 合并时若用 squash,务必让 PR 标题本身符合 Conventional Commits,否则一整个 PR 只剩一条无意义记录。
  4. 把 chore 全过滤掉了。依赖安全升级往往标成 chore,但用户其实需要知道,建议把 chore(deps) 单独归入"依赖更新"分组。安全相关变更的重要性,可以对照 AI代码安全扫描工具免费推荐 里的思路来判断。
  5. 过度信任大模型改写。模型可能把"修复了偶现崩溃"写成"大幅提升稳定性",涉及合规与承诺的措辞必须人工过一遍。

六、常见问题

历史提交完全不规范,还能自动生成吗?

能,但要分两段处理:历史部分用大模型批量改写(把 git log 导出后让模型分类整理,一次性写进 CHANGELOG.md 的历史区),从当前版本开始启用 commitlint 强制规范,新的部分交给工具自动生成。不要试图去改写历史提交信息,成本高且会破坏协作。

这些工具需要联网调用大模型吗?

前五款都是纯本地规则解析,不联网、不上传代码,企业内网环境可以放心用。只有第六节的改写环节需要调用模型,如果代码涉密,可以只把已脱敏的提交标题发给模型,或改用本地部署模型。

非 Git 项目(SVN)怎么办?

先用 git svn 做一层镜像,再套用 git-cliff;或者直接跳到第六节的提示词方案,把 SVN 日志导出后交给模型整理,虽然不够自动,但比手写快得多。

CHANGELOG 和 Release Notes 是一回事吗?

不是。CHANGELOG.md 面向开发者,按版本罗列全部技术变更,追求完整;Release Notes 面向用户,只讲"你能感知到的变化",追求可读。理想做法是前者用工具自动生成、后者用大模型从前者改写而来,两份都保留。

要不要把 CHANGELOG.md 提交进仓库?

要。它是项目历史的一部分,也是新成员理解演进过程的最快入口。真正需要避免的是"手动维护",而不是"提交进仓库"。

写在最后

自动生成 CHANGELOG 这件事,本质上不是工具问题,而是提交规范问题。工具再强,也只能从你写下的提交信息里提取价值——垃圾进,垃圾出。所以真正的落地顺序应该是:先用 commitlint 把规范强制起来,再选一款自动化工具接进 CI,最后用大模型加一层人话改写。三步走完,你会发现发版前那一小时,终于可以真正省下来了。

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论