前言

开发前端项目的时候,偶然想自动生成版本号,结果就发现了standard-version这个玩意儿,没想到,版本控制竟然如此美妙!

但是如果是前后端分离的项目的话,用前端来管理整体的版本号与变更内容是不是就太离谱了。

然后就找了下单独根据Git提交记录生成变更内容的插件,前后端项目的版本号由我自己单独控制,你别说,还真有!

一起来看看Git-Cliff是怎么用的吧!

安装

Rust

因为Git-Cliff是基于Rust的,我们需要Rust环境,到Rust官网进行安装,参考Windows安装Rust环境(详细教程)

Git-Cliff

查阅Git-Cliff 官方手册

  1. 执行以下命令进行安装:

    1
    cargo install git-cliff
  2. 初始化:到git仓库根目录执行:

    小贴士:感觉它像是git的内置命令对吧,不对,是因为它遵循了git插件的命名规范,git-<插件名>,所以能直接找到git-cliff

    1
    git cliff --init

    生成cliff.toml文件,用于定义变更文件规则,可以参考我的toml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    # git-cliff 配置文件
    # https://git-cliff.org/docs/configuration
    #
    # 以 "#" 开头的行是注释。
    # 配置选项按表和键组织。
    # 更多可用选项请参阅文档。

    [changelog]
    # 变更日志的标题模板
    header = """
    # 变更日志\n
    本文件记录了本项目的所有重要变更。\n
    """

    # 变更日志的内容模板
    # https://keats.github.io/tera/docs/#introduction
    body = """
    {% if version %}\
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
    {% else %}\
    ## [未发布]
    {% endif %}\
    {% for group, commits in commits | group_by(attribute="group") %}
    ### {{ group | striptags | trim | upper_first }}
    {% for commit in commits %}
    - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\
    {% if commit.breaking %}[**破坏性变更**] {% endif %}\
    {{ commit.message | upper_first }}\
    {% endfor %}
    {% endfor %}\n
    """

    # 变更日志的页脚模板
    footer = """
    <!-- 由 git-cliff 生成 -->
    """

    # 移除内容前后的空白
    trim = true

    # 后处理器
    postprocessors = [
    # { pattern = '<REPO>', replace = "https://github.com/orhun/git-cliff" }, # 替换仓库 URL
    ]

    # 即使没有发布版本也渲染内容
    # render_always = true

    # 输出文件路径
    # output = "CHANGELOG.md"

    [git]
    # 基于 https://www.conventionalcommits.org 解析提交信息
    conventional_commits = true

    # 过滤掉不符合规范的提交
    filter_unconventional = true

    # 将提交的每一行作为单独的提交处理
    split_commits = false

    # 提交信息的预处理正则表达式
    commit_preprocessors = [
    # 替换问题编号
    #{ pattern = '$(\w+\s)?#([0-9]+)$', replace = "([#${2}](<REPO>/issues/${2}))"},
    # 使用 https://github.com/crate-ci/typos 检查提交信息的拼写
    # 如果拼写错误,会自动修正。
    #{ pattern = '.*', replace_command = 'typos --write-changes -' },
    ]

    # 提交信息的解析和分组规则
    commit_parsers = [
    { message = "^feat", group = "🚀 新功能" },
    { message = "^fix", group = "🐛 Bug 修复" },
    { message = "^docs", group = "📚 文档更新" },
    { message = "^style", group = "🎨 代码样式" },
    { message = "^refactor", group = "🚜 代码重构" },
    { message = "^perf", group = "⚡ 性能优化" },
    { message = "^test", group = "🧪 测试相关" },
    { message = "^build", group = "📦 构建系统" },
    { message = "^ci", group = "🔧 CI 配置" },
    { message = "^chore", group = "⚙️ 杂项任务" },
    { message = "^revert", group = "◀️ 回滚变更" },
    { message = "^security", group = "🛡️ 安全相关" },
    { message = "^wip", group = "🚧 进行中" },
    { message = "^deps", group = "📦 依赖更新" },
    { message = "^init", group = "🎉 初始化" },
    { message = "^config", group = "⚙️ 配置变更" },
    { message = "^release", group = "🏷️ 版本发布" },
    { message = "^hotfix", group = "🔥 紧急修复" },
    { message = "^breaking", group = "💥 破坏性变更" },
    { message = ".*", group = "💼 其他" },
    ]

    # 过滤掉未被提交解析器匹配的提交
    filter_commits = false

    # 按拓扑顺序排序标签
    topo_order = false

    # 按提交时间排序(oldest 或 newest)
    sort_commits = "oldest"
  3. 生成变更记录文档

    1
    git cliff -o CHANGELOG.md

参考文档

Windows安装Rust环境(详细教程)

Git-Cliff 官方手册