3.3k Star!实用命令行工具,自动生成更新日志文件

【导语】:基于 Git 历史记录自动生成日志变更文件。

简介

git-cliff 可用正常提交记录以及基于正则的自定义解析,从 Git 历史记录生成 changelog 文件,变更日志模板可以使用配置文件进行定制,以匹配所需的格式。

类似的项目还有:

  • git-journal - Git 提交消息和变更日志生成框架
  • clog-cli - 从 Git 提交历史生成漂亮的变更日志
  • relnotes - 为项目自动生成发行说明的工具
  • cocogitto - 用于常规提交和 semver 规范的 CLI 工具

项目地址:

https://github.com/orhun/git-cliff

安装

从 crates.io 进行安装

cargo install git-cliff

使用 pacman

pacman -S git-cliff

从源码构建

# linux 下依赖 zlib,生成的文件存放在 `target/release/git-cliff` 目录
CARGO_TARGET_DIR=target cargo build --release

用法

命令格式

git-cliff [FLAGS] [OPTIONS] [RANGE]

例子

使用 --init 选项可以生成默认的配置文件 cliff.toml
git cliff --init
在项目的根目录下,可以很简单地生成 changlog 文件:
# 等价于 `git-cliff --config cliff.toml --repository .`
# 等价于 `git-cliff --workdir .`
git cliff
打 tag:
git cliff --tag 1.0.0
为 git 历史的某个部分生成 changelog:
# 为 latest tag 生成 changelog
git cliff --latest

# 为未发布的内部生成 changelog
git cliff --unreleased
git cliff --unreleased --tag 1.0.0

# 为指定的某个 commit 生成 changelog
git cliff 4c7b043..a440c6e
git cliff 4c7b043..HEAD
git cliff HEAD~2..
指定生成某个目录的 changelog:
git cliff --commit-path project1/
将 changelog 保存到指定文件中
git cliff --output CHANGELOG.md
将新变更追加到 changelog 中:
git cliff --unreleased --tag 1.0.0 --prepend CHANGELOG.md

配置文件

git-cliff 配置文件支持 TOML(首选)和 YAML 格式。

如果 $HOME/git-cliff/cliff.toml 文件存在,则从配置文件中读取。此位置取决于不同的平台,例如:

# 在 Linux 上: /home/<user>/.config/git-cliff/cliff.toml
# 在 Windows 上:C:\Users\<user>\AppData\Roaming\git-cliff\cliff.toml
# 在 macOS 上: /Users/<user>/Library/Application Support/git-cliff/cliff.toml

changelog

changelog 生成的配置选项如下:

[changelog]
header = "Changelog"
body = """
{% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | upper_first }}
    {% for commit in commits %}
        - {{ commit.message | upper_first }}
    {% endfor %}
{% endfor %}
"""
trim = true
footer = "<!-- generated by git-cliff -->"
  • header,changelog 的标题
  • body,changelog 中的主体模板
  • trim,如果设置为 true,将删除文本中前导和尾随空格
  • footer,changelog 的页脚文本

git

git 相关的配置选项:

[git]
conventional_commits = true
commit_parsers = [
    { message = "^feat", group = "Features"},
    { message = "^fix", group = "Bug Fixes"},
    { message = "^doc", group = "Documentation"},
    { message = "^perf", group = "Performance"},
    { message = "^refactor", group = "Refactor"},
    { message = "^style", group = "Styling"},
    { message = "^test", group = "Testing"},
]
filter_commits = false
tag_pattern = "v[0-9]*"
skip_tags = "v0.1.0-beta.1"
conventional_commits

如果设置为 true,则根据约定式提交规范进行解析提交。规范参考下面链接地址:

https://www.conventionalcommits.org/en/v1.0.0/

约定式提交规范是一种基于提交信息的轻量级约定。提供一组简单规则来创建清晰的提交历史;这有利于编写自动化工具。通过在提交信息中描述功能、修复和破坏性变更,使这种惯例与 SemVer 相互对应。

提交说明的结构如下所示:

<type>[optional scope]: <description>

[optional body]

[optional footer(s)]

# 如:feat(parser): add ability to parse arrays
commit_parsers

提交解析器,用于使用正则表达式确定提交组:

# 如果提交消息以“feat”开头,则将提交分组为“Features”。
{ message = "^feat", group = "Features"}

# 如果提交正文包含“security”,则将提交分组为“Security”。
{ body = ".*security", group = "Security"}

# 如果提交正文和消息包含“deprecated”,则将提交分组为“Deprecation”
{ message = ".*deprecated", body = ".*deprecated", group = "Deprecation"}

# 如果提交消息(描述)以“revert”开头,则跳过处理提交。
{ message = "^revert", skip = true}

# 如果提交以“doc”开头,则将提交分组为“Documentation”
{ message = "^doc", group = "Documentation", default_scope = "other"}
filter_commits

如果设置为 true,则提交解析器不匹配的提交将被过滤掉。

tag_pattern

用于匹配 git 标签的 glob 模式。例如,它处理与以下 git 命令的输出相同的标签:

git tag --list 'v[0-9]*'
skip_tags

用于跳过处理匹配标签的正则表达式。

开源前哨 日常分享热门、有趣和实用的开源项目。参与维护 10万+ Star 的开源技术资源库,包括:Python、Java、C/C++、Go、JS、CSS、Node.js、PHP、.NET 等。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容