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 每次 ...
随机推荐
- Centos7安装mysql8.0教程
1.背景 centos7安装mysql8.0 2.安装步骤 步骤一:安装准备工作 1.查看是否有安装过mysql rpm -qa | grep -i mysql 2.删除mysql yum -y re ...
- 使用 defineNuxtRouteMiddleware 创建路由中间件
title: 使用 defineNuxtRouteMiddleware 创建路由中间件 date: 2024/8/10 updated: 2024/8/10 author: cmdragon exce ...
- 【牛客刷题】HJ4 字符串分隔
题目链接 这个题目本身基本上是对语言熟悉程度的考察,没有什么别的逻辑可言: package main import ( "fmt" "strings" ) fu ...
- div构建table
1.Css display值与解释-(详细可见CSS手册的CSS display手册)参数:block :块对象的默认值.用该值为对象之后添加新行none :隐藏对象.与visibility属性的hi ...
- quartz监控日志(二)添加监听器
上一章介绍监控job有三种方案,其实还有一个简单方案是实现quartz的TriggerListener. 上次我也试了这个方案,但是由于操作错误,导致没有监控成功,所以才选择分析源码来实现代理进行监控 ...
- 什么是AOP,以及在Springboot中自定义AOP
AOP (Aspect Oriented Programming)一般译为面向切面编程 Aspect [ˈæspekt] n.方面;层面;(动词的)体那么AOP 面相切面编程具体是指什么,它和之前的O ...
- 流体饱和多孔介质的本构关系 + Föppl-von Kármán 方程
向有液体的多孔介质上施加应力,应力一部分分布到骨架上,一部分分布到孔隙流体上.骨架上的应力会导致变形,所以被称为 "有效应力".这里考虑拉伸应力为正,有效应力原理写为 \[\sig ...
- 使用 nuxi dev 启动 Nuxt 应用程序的详细指南
title: 使用 nuxi dev 启动 Nuxt 应用程序的详细指南 date: 2024/9/2 updated: 2024/9/2 author: cmdragon excerpt: 摘要:本 ...
- C#/.net core “hello”.IndexOf(“\0”,2)中的坑
先想想看,你认为下面代码返回值是多少? "hello".IndexOf("", 2); "hello".IndexOf("\0&q ...
- Atziluth's Last Contest. 001题解
被dalaoYHH爆虐 问题 H:mcd 题目描述 给出两个长为 \(n\) 的数列 \({a_n},{b_n}\),保证 \(a_i\le b_i(i=1,2,\cdots,n)\). 现在您需要对 ...