发布软件时通常都会写 Release Note,但每次从头手打也有点累,可以考虑从 Git 的提交历史中自动生成。

Git 提交信息一般是三段式结构,段落之间使用空行隔开:

<subject>
// 空行
<body>
// 空行
<trailers>

subjectbody 自不必多说,trailers 中一般是一条条键 -- 值对构成的信息,键和值由冒号 : 分隔。比如 Git 的 Commiter: 就可以视为一条 trailer,Gerrit 代码审查通过后,也会在 Git 提交消息中添加 Reviewed-by:Tested-by: 之类的 trailer

现假设提交信息中的 trailers 包含 TypeIssue 字段,分别表示类别(NewFeature, BugFix 之类)和 BUG 编号(GitHub 上的 issue 编号或者内部系统的 BUG 编号):

Fixed a crash

- blahblah
- blahblahblah Type: BugFix
Issue: issue-120

就可以结合 git logawk 生成 Rlease Note:

git log --format='%(trailers:key=Type,valueonly,separator=%x20)%x1c%s [%(trailers:key=Issue,valueonly,separator=,)]' $FROM..HEAD | awk -F "\034" '
{
gsub(/\[\]$/, "", $2);
if (length($1) == 0) $1="MISC";
if (!($1 in item_count)) item_count[$1]=0;
items[$1, item_count[$1]]=$2;
item_count[$1]++;
}
END {
for (k in item_count) {
print k;
k2=k;
gsub(/./, "-", k2);
print k2
for (i=0; i<item_count[k]; i++) print "* "items[k, i];
print ""
}
}'

输出:

BugFix
------
* Fixed a typo
* Fixed a crash [issue-120] NewFeature
----------
* Added some magic

选择使用 awk 处理 git log 的输出是因为 linux 跟 macOS 都带这个软件,不需要额外安装依赖。

Git 2.22.0 及以上版本才支持按键值筛选 trailers

在 Windows 系统上,可能没有办法直接运行 .sh 文件。但是如果安装了 Windows 版本的 Git,则会带一个 Git Bash(也带了 awk!),这样就可以在 Git Bash 中运行 .sh 文件,也可以创建一个 .cmd 文件包装一下:

@ECHO off
SETLOCAL CALL :FIND-PATH GITEXE_PATH git.exe
IF "%GITEXE_PATH%"=="" (
ECHO git.exe is not found on your system
EXIT /B 2
) CALL :GET-DIR-NAME GITEXE_DIR "%GITEXE_PATH%"
CALL :GET-DIR-NAME GITEXE_DIR "%GITEXE_DIR:~0,-1%" @"%GITEXE_DIR%bin\bash.exe" release-note.sh %* :FIND-PATH
SET "%~1=%~f$PATH:2"
EXIT /B :GET-DIR-NAME
SET "%~1=%~dp2"
EXIT /B

上面的脚本只能把 release note 生成出来,如果可以直接添加到 changelog.md 就好了,可以把脚本做如下改动。

一,添加版本信息。添加一个变量 PROJ_VER 表示当前项目版本,以 maven 项目为例:

PROJ_VER=`./mvnw help:evaluate -Dexpression='project.version' -q -DforceStdout|tail -n 1`

然后将这个变量暴露给 awk,在 awk 命令后面添加 -v PROJ_VER PROJ_VER 即可。

二,将版本和日期打印出来。在 awk 程序中添加 BEGIN 块:

BEGIN {
"date +%Y-%m-%d"|getline date;
if (PROJ_VER == "") print "# "date;
else print "# "PROJ_VER" "date;
}

三,在 change.md 头部追加生成的内容:

# 生成临时文件
tempf=`mktemp $TEMP/changelog.md.XXXX`
touch changelog.md # 将生成的内容与原 changelog.md 中的内容合并,保存到临时文件中,然后用临时文件替换当前文件即可
... | cat - changelog.md > $tempf && mv $tempf changelog.md

这样一顿操作下来,生成的 changelog.md 如下:

# 1.2.3 2023-03-31
BugFix
------
* Fixed a typo
* Fixed a crash [issue-120] NewFeature
----------
* Added some magic

awk 处理 Git 提交信息生成 Release Note的更多相关文章

  1. 写得好 git 提交信息

    编写好 git 提交信息 提交信息 我们作出答复,更改将提交相关信息,这些信息通常被认为是重要的信息会小心留下应该离开,你为什么需要这个提交实例,提交解决任何问题. 我们需要良好的信息组织,虽然后来, ...

  2. git push撤销、git commit 撤销、git add撤销、修改git提交信息

    原文地址:http://leisure.wang/?p=472 虽然自觉是一个Git工具的老手了,但是平时犯了一点错误,就发现有点捉襟见肘了.就好像今天我把一些代码玩坏了,想撤回到前几个版本去(此时已 ...

  3. 怎么创建一个良好的Git提交信息

    译   原文:https://dev.to/chrissiemhrk/git-commit-message-5e21 提交信息是对提交之前添加和更改的文件所做的更改的简短描述. 良好的提交信息不仅对你 ...

  4. 在 Git 提交信息中使用 Emoji

    Gitmoji 旨在解释如何在 Git 提交消息时使用表情符号.在提交信息时使用表情符号,可以更容易地识别提交的目的或意图. Emoji 列表 :优化项目结构 / 代码格式 :art: ️ :性能提升 ...

  5. commit lint规范化团队git提交信息

    一.快速提交符号angular编码规范的提交信息 1.命令行中安装commitizen: npm install -g commitizen commitizen init cz-convention ...

  6. 使用gradle构建Android时 版本号versionName中嵌入git提交信息

    为什么要这么做   在应用开发的版本迭代过程中,通过版本号并不能快速定位到所对应的代码,导致在后面分析问题追溯对应版本的代码时比较麻烦.   如果代码是通过git来管理的,git的commit id等 ...

  7. [Golang] 编译程序时打上git提交信息标记

    1.加入代码 //version.go package version import ( "flag" "fmt" "os" ) var ( ...

  8. 老鸟都应该注意的git 提交规范

    不知道大家有没有看过自己项目的git 提交信息-----我看过好多次 ,不忍直视  然后提醒一起的小伙伴 :大家规范点 信息要详细, 过段时间再看下 ,还是一样. 相信很多猿都有这样的感受,对于垃圾的 ...

  9. 【vue3-element-admin】Husky + Lint-staged + Commitlint + Commitizen + cz-git 配置 Git 提交规范

    前言 本文介绍 vue3-element-admin 如何通过 Husky + Lint-staged + Commitlint + Commitizen + cz-git 来配置 Git 提交代码规 ...

  10. Git提交代码规范 而且规范的Git提交历史,还可以直接生成项目发版的CHANGELOG(semantic-release)

    Git提交代码规范 - 木之子梦之蝶 - 博客园 https://www.cnblogs.com/liumengdie/p/7885210.html Commit message 的格式 Git 每次 ...

随机推荐

  1. 如何在通用异常处理时获取到方法名称(获取注解参数JoinPoint)

    1.背景 很多时候我们在梳理公共异常时,需要获取到接口的而具体名称,便于很好的提示是那个接口错误了 2.实现逻辑 1.在controller方法上的注解上写方法名称,一般使用了swagger都有方法名 ...

  2. 微服务全链路跟踪:springcloud集成jaeger

    微服务全链路跟踪:grpc集成zipkin 微服务全链路跟踪:grpc集成jaeger 微服务全链路跟踪:springcloud集成jaeger 微服务全链路跟踪:jaeger集成istio,并兼容u ...

  3. flink + iceberg 快速搭建指南

    flink + iceberg 快速搭建 the environment includes: minio iceberg flink Centos 更换 tencent 的yum源 备份系统旧配置文件 ...

  4. 从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章)

    从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章) 1.简介 该项目整合了编程.AI.产品设计.商业科技及个人成长等多领域的精华内容,源自顶 ...

  5. JVM笔记八-堆参数调优

    JVM垃圾收集器(Java Garbage Collection).本教程均在JDK1.8+HotSpot为例来讲解的. 先来看看Java7的: 编辑 ​ 再来看看Jva8的 编辑 ​ 从上图中我们可 ...

  6. 编译和分发 Chez Scheme 应用程序

    参考 Building and Distributing Applications. 假设源码由两个文件组成,A.ss 和 B.ss,其中 A.ss 依赖 B.ss.下面我们将其编译为可供分发的二进制 ...

  7. 使用gin实现简单的注册和登录功能

    一.前言 使用了gorm操作数据库,后端基于gin框架,只是一个简单的注册和登录与数据库交互的后端实现例子. 二.目录结构 -templates --regist.html --login.html ...

  8. Go runtime 调度器精讲(五):调度策略

    原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 在 第四讲 我们介绍了 main goroutine 是如何运行的.其中针对 main goroutine 介绍了调度函数 schedule 是 ...

  9. 云上分布式SQL Server,你值得拥有

    云上分布式SQL Server,你值得拥有 介绍Microsoft SQL Azure 是微软的云关系型数据库,后端存储又称为云 SQL Server(Cloud SQL Server).它构建在 S ...

  10. Python写入数据到MySQL数据库并读取

    1.导入pymysql库   命令行输入pip3 install PyMySQL    2.连接数据库 import pymysql db = pymysql.connect(host='localh ...