Commit规范
在团队开发过程中,如果大家Commit Message不统一或者写的不清晰,很难看出一次提交修改了哪些内容。对于codereview来说也很难作为参考。目前,社区有多种 Commit message 的写法规范,这里推荐使用angular规范,格式如下:
<type>(<scope>): <subject>
<空行>
<body>
<空行>
<footer>
其中 head((): )是必须的,body和footer是可选的。angular规范详细说明,网上有很多,随便贴一篇:https://juejin.cn/post/6844903720761688077
Header
Type
commit的类别,包涵以下七种:
feat:新功能(feature)
fix:修补bug
docs:文档(documentation)
style: 格式(不影响代码运行的变动)
refactor:重构(即不是新增功能,也不是修改bug的代码变动)
test:增加测试
chore:构建过程或辅助工具的变动
Scope
commit的影响范围,比如会影响到哪个模块/性能/哪一层(业务层,持久层,缓存,rpc),如果是特性代码,可以写特性名称
Subject
commit的简短描述,不超过50个字符。
注意:一条commit只能包含一条内容,不能将多个bug或功能合并提交。因为各种各样的原因,我们会有一些没有什么意义的commit信息或一个bug提交多次。我们可以使用git rebase来合并多次commit。注意:git rebase只能作用未push的commit,并且为避免不必要的冲突,建议git rebase只在自己的分支中使用,不能在公共分支中使用
git rebase -i HEAD~4 #HEAD~4代表修改最近的四次提交
git rebase使用详见:https://segmentfault.com/a/1190000020953109
Git Commit Template
android studio安装Git Commit Template提交模板插件(Settings>Plugins直接搜索Git Commit Template),我们安装完在git提交页面写message的地方会有个小按钮,打开就能辅助我们写好标准angular格式的commit message
注意:由于脚本的限制commit描述中不能出现#号。针对fix类型,如果tapd上有关联bug,需要再Closed issues中写上对应bug号,便于change log中bug关联
changelog.sh脚本
changelog.sh脚本是用来生成change log
#!/bin/bash
#获取两个 commitId 之间的 message
function getInputCommitId(){
tag1=$1
tag2=$2
#获取的 message 区间为[),这里添加将提交信息放在<start><end>之间编译内容分割,和bug号提取
git log --pretty=format:"<start>%n%s%n%b%n<end>" ${tag1}...${tag2} >commits.txt
}
temp=""
type=0
startFlag="<start>"
endFlag="<end>"
# 使用正则判断 commits.txt 每行开头是否符合我嗯的规则,并生成feat.txt和fix.txt
function generateDoc(){
if [ "$1" == "$startFlag" ]
then
temp=""
type=0
fi
# $1 代表方法 第一个入参数,方法参数为每行文本
if [[ "$1" =~ ^feat.*:$ ]]
then
msg="${@}"
temp=$temp$msg
type=1
# echo ${msg} >> feat.txt
elif [[ "$1" =~ ^fix.*:$ ]]
then
msg="${@}"
temp=$temp$msg
type=2
# echo $msg >> fix.txt
elif [[ "$1" =~ ^refactor.*:$ ]]
then
msg="${@}"
temp=$temp$msg
type=3
# echo $msg >> refactor.txt
elif [[ "$1" =~ ^Closes.*$ ]]
then
msg="${@:2}"
temp=$temp$msg
fi
if [ "$1" == "$endFlag" ]
then
if [ $type == 1 ]
then
echo ${temp} >> feat.txt
elif [ $type == 2 ]
then
echo ${temp} >> fix.txt
elif [ $type == 3 ]
then
echo ${temp} >> refactor.txt
fi
fi
}
$(rm -rf CHANGELOG.md)
getInputCommitId $1 $2
# 读取 commits.txt 每行文本
while read line || [[ -n ${line} ]]
do
message=${line}
generateDoc ${message}
done < commits.txt
# 删除 commits.txt
$(rm -rf commits.txt)
# 生成标题
branch=$(git symbolic-ref --short -q HEAD)
time=$(git log --pretty=format:"%ai" ${tag2} -1)
echo "## $tag2 - $tag1 $branch ($time)" >>CHANGELOG.md
# 生成Features行
echo "### Features" >>CHANGELOG.md
while read line
do
echo "* "${line} >> CHANGELOG.md
done < feat.txt
(rm -rf feat.txt)
# 生成Fixs行
echo "### Fixs" >>CHANGELOG.md
while read line
do
array=(${line//#/ })
if [ ${#array[*]} == 3 ]
then
# 关联bug链接,这样以tapd为例
msg=${array[0]}${array[1]}"#["${array[2]}"](https://www.tapd.cn/42576611/bugtrace/bugs/view?bug_id="${array[2]}")"
echo "* "${msg} >> CHANGELOG.md
else
echo "* "${line} >> CHANGELOG.md
fi
done < fix.txt
(rm -rf fix.txt)
# 生成Refactor行
echo "### Refactor" >>CHANGELOG.md
while read line
do
echo "* "${line} >> CHANGELOG.md
done < refactor.txt
(rm -rf refactor.txt)
# 判断文件是否存在
if [[ -f "./CHANGELOG.md" ]]
then
echo CHANGELOG.md is exsit
else
echo '# ChangeLog' >CHANGELOG.md
fi
# 读取 ChangeLog 文件,删除重复输入一直的内容,使用第一个输入的参数作为锚点对比
while read text
do
((++i))
if [[ ${text} =~ "## $tag2" ]]
then
start=$i
elif [[ $tag1 != "" && ${text} =~ "## $tag1" ]]
then
end=$i
fi
done < CHANGELOG.md
# ${start} 为起始行
# ${end} 为结束行
if [[ "" = "$end" ]]
then
if [[ "" != "$start" ]]
then
# 如果没有结束行,则删除起始行以后所有的内容
$(sed -i "" "$start,\$d" CHANGELOG.md)
fi
else
((--end))
# 应换为插入
if [[ "$start" -gt "$end" ]]
then
$(sed -i "" "$start,\$d" CHANGELOG.md)
else
# 如果有结束行 则删除之间所有的内容
$(sed -i "" "$start,${end}d" CHANGELOG.md)
fi
fi
$(rm -rf commits.txt)
生成change log
使用changelog.sh脚本生成change log,脚本接收两个参数(开始commit id与结束commit id,不包括开始结束)。不传结束commit id默认到最新提交记录。将changelog.sh脚本复制到工程下,执行:
changelog.sh 2d1e8535 3e1d9536
在脚本同目录下生成CHANGELOG.md,可将change log信息作为提测内容