前言
在git项目中,通过添加CHANGELOG.md可以展示项目的版本更新记录,方便用户查看项目的重大bug修复或不兼容版本信息,
本文介绍一个 changelog 工具,使用git命令获取git repository中的所有tags和commits log,生成CHANGELOG.md,
一、使用方法
安装:
go install github.com/xpunch/changelog
打开项目目录运行
changelog
或者通过命令列指定项目目录
changelog --source ~/gitrepo --output ~/gitrepo/CHANGELOG.md --fetch --verbose
二、代码实作
1、呼叫git命令
func git(dir string, args ...string) (string, error) {
cmd := exec.Command("git", args...)
var out bytes.Buffer
cmd.Stdout = &out
cmd.Dir = dir
err := cmd.Run()
return out.String(), err
}
通过exec呼叫git命令,并传入自变量,需要本地git命令可以运行,并拥有repository的访问权限,
2、拉取最新的repository
git fetch --all
更新本地仓储的tags和commits,保证生成的CHANGELOG.md是基于最新的提交记录,
3、获取tags
git tag -n -l --sort=creatordate --format %(refname:short);%(creatordate:short);%(subject)
通过上面的命令可以获取所有的tag信息,
4、获取tag间提交记录生成
git log --no-merges --format=oneline tagA..tagB
通过上面的命令可以获取两个tag间的提交记录,
5、整合获取的git信息,生成CHANGELOG.md
使用 github.com/hashicorp/go-version 比较版本号大小,并重新排序,
sort.Slice(records, func(i, j int) bool {
s, t := records[i].Version, records[j].Version
vs, err := version.NewVersion(s)
if err != nil {
return s < t
}
vt, err := version.NewVersion(t)
if err != nil {
return s < t
}
return vs.LessThan(vt)
})
根据提交信息前缀简单分为Features和Bug Fixes
if strings.HasPrefix(msg, "[fix]") {
records[i].BugFixes = append(records[i].BugFixes, strings.TrimSpace(strings.TrimPrefix(msg, "[fix]")))
} else if strings.HasPrefix(msg, "[feat]") {
records[i].Features = append(records[i].Features, strings.TrimSpace(strings.TrimPrefix(msg, "[feat]")))
} else if strings.HasPrefix(msg, "[feature]") {
records[i].Features = append(records[i].Features, strings.TrimSpace(strings.TrimPrefix(msg, "[feature]")))
} else if strings.Contains(msg, "fix") {
records[i].BugFixes = append(records[i].BugFixes, msg)
} else {
records[i].Features = append(records[i].Features, msg)
}
最终效果:
# 1.1.0 (2022/01/17) ### Features - separate features and bug fixes disable fetch by deafult ### Bug Fixes - fixing first tag not have commit logs issue # 1.0.0 (2022/01/14) ### Features - support create changelog.md from git repository - Initial commit
总结
本文介绍了如何使用go呼叫git命令,利用git相关命令获取历史提交记录,并生成CHANGELOG.md档案,
CHANGELO格式只是我根据自己的理解定义的,如果需要自定义格式,可以fork代码自行修改,
完整代码:https://github.com/xpunch/changelog
0 评论