awk 处理 Git 提交信息生成 Release Note
发布软件时通常都会写 Release Note,但每次从头手打也有点累,可以考虑从 Git 的提交历史中自动生成。
Git 提交信息一般是三段式结构,段落之间使用空行隔开:
<subject>
// 空行
<body>
// 空行
<trailers>
subject 和 body 自不必多说,trailers 中一般是一条条键 -- 值对构成的信息,键和值由冒号 : 分隔。比如 Git 的 Commiter: 就可以视为一条 trailer,Gerrit 代码审查通过后,也会在 Git 提交消息中添加 Reviewed-by: 和 Tested-by: 之类的 trailer。
现假设提交信息中的 trailers 包含 Type 和 Issue 字段,分别表示类别(NewFeature, BugFix 之类)和 BUG 编号(GitHub 上的 issue 编号或者内部系统的 BUG 编号):
Fixed a crash
- blahblah
- blahblahblah
Type: BugFix
Issue: issue-120
就可以结合 git log 和 awk 生成 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的更多相关文章
- 写得好 git 提交信息
编写好 git 提交信息 提交信息 我们作出答复,更改将提交相关信息,这些信息通常被认为是重要的信息会小心留下应该离开,你为什么需要这个提交实例,提交解决任何问题. 我们需要良好的信息组织,虽然后来, ...
- git push撤销、git commit 撤销、git add撤销、修改git提交信息
原文地址:http://leisure.wang/?p=472 虽然自觉是一个Git工具的老手了,但是平时犯了一点错误,就发现有点捉襟见肘了.就好像今天我把一些代码玩坏了,想撤回到前几个版本去(此时已 ...
- 怎么创建一个良好的Git提交信息
译 原文:https://dev.to/chrissiemhrk/git-commit-message-5e21 提交信息是对提交之前添加和更改的文件所做的更改的简短描述. 良好的提交信息不仅对你 ...
- 在 Git 提交信息中使用 Emoji
Gitmoji 旨在解释如何在 Git 提交消息时使用表情符号.在提交信息时使用表情符号,可以更容易地识别提交的目的或意图. Emoji 列表 :优化项目结构 / 代码格式 :art: ️ :性能提升 ...
- commit lint规范化团队git提交信息
一.快速提交符号angular编码规范的提交信息 1.命令行中安装commitizen: npm install -g commitizen commitizen init cz-convention ...
- 使用gradle构建Android时 版本号versionName中嵌入git提交信息
为什么要这么做 在应用开发的版本迭代过程中,通过版本号并不能快速定位到所对应的代码,导致在后面分析问题追溯对应版本的代码时比较麻烦. 如果代码是通过git来管理的,git的commit id等 ...
- [Golang] 编译程序时打上git提交信息标记
1.加入代码 //version.go package version import ( "flag" "fmt" "os" ) var ( ...
- 老鸟都应该注意的git 提交规范
不知道大家有没有看过自己项目的git 提交信息-----我看过好多次 ,不忍直视 然后提醒一起的小伙伴 :大家规范点 信息要详细, 过段时间再看下 ,还是一样. 相信很多猿都有这样的感受,对于垃圾的 ...
- 【vue3-element-admin】Husky + Lint-staged + Commitlint + Commitizen + cz-git 配置 Git 提交规范
前言 本文介绍 vue3-element-admin 如何通过 Husky + Lint-staged + Commitlint + Commitizen + cz-git 来配置 Git 提交代码规 ...
- Git提交代码规范 而且规范的Git提交历史,还可以直接生成项目发版的CHANGELOG(semantic-release)
Git提交代码规范 - 木之子梦之蝶 - 博客园 https://www.cnblogs.com/liumengdie/p/7885210.html Commit message 的格式 Git 每次 ...
随机推荐
- Wetab 标签页:内置多种免费实用优雅小组件的浏览器主页和起始页
Wetab 是什么? Wetab 是一款基于浏览器的新标签页产品,主张辅助用户打造一个兼具效率与美观的主页. Wetab 的核心特色便是内置了多种实用.优雅的小组件. 今天这篇,主要按照分类详细介绍 ...
- ApplicationRunner的讲解
在开发中可能会有这样的情景.需要在容器启动的时候执行一些内容.比如读取配置文件,数据库连接之类的.SpringBoot给我们提供了两个接口来帮助我们实现这种需求.这两个接口分别为CommandLine ...
- 微服务全链路跟踪:jaeger坑之NoSuchMethodError: io.jaegertracing.agent.thrift.Agent$Client.sendBaseOneway
在jaeger使用过程中遇到了一个奇怪的问题,本来jaeger运行的好好的,jaeger配置与依赖都没动,就上了一个版本,结果jaeger就没上报监控数据了,由于生产上没打印info日志,后面在本地试 ...
- 嵌入式软件开发人员有必要学习系统移植的知识吗?【ppt获取见文末】
<从零开始学ARM>的配套视频说明 为了让粉丝更好的学习我的新书里面的知识, 一口君特地录制了配套学习视频, <从0学ARM第一期> <从0学ARM第一期> 视频已 ...
- JavaScript设计模式样例十九 —— 职责链模式
职责链模式(Chain of Responsibility Pattern) 定义:为请求创建了一个接收者对象的链. 目的:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接 ...
- 仿MFC的消息印射(全局函数的实现)
//弄了个仿MFC消息映射,这是全局函数都好弄,照着MFC就弄出来了,//在vs2017上可以通过#include <windows.h> #include "resource. ...
- docker network macvlan
ref: Docker 网络模型之 macvlan 详解,图解,实验完整 网卡也能虚拟化?网卡虚拟化技术 macvlan 详解 docker和macvlan与host互通
- 傅里叶级数 傅里叶变换 FFT 时域 频域 功率谱 能量谱 功率谱密度PSD
傅立叶级数是基于周期函数的,如果我们把周期推广到
- Angular 18+ 高级教程 – Reactive Forms
前言 上一篇的 Ajax 和这一篇的表单 (Form) 都是前端最最最常见的需求. 为此,Angular 分别提供了两个小型库来帮助开发者实现这些需求: Ajax – HttpClient Form ...
- maven安装本地jar命令
mvn install:install-file -Dfile=jar包的位置 -DgroupId=pom.xml的groupId -DartifactId=pom.xm的artifactId -Dv ...