统计git提交代码行数

git相关命令

git 查询某时间段内代码提交行数(含增、删):

1
git log --pretty=tformat: --numstat --author=Nova --since=2021-01-01 --until=2022-01-31 | awk '{add += $1; subs += $2} END {printf "added lines: %s, removed lines: %s", add, subs}'

git log 的常用选项

选项说明
-p按补丁格式显示每个提交引入的差异。
--stat显示每次提交的文件修改统计信息。
--shortstat只显示 –stat 中最后的行数修改添加移除统计。
--name-only仅在提交信息后显示已修改的文件清单。
--name-status显示新增、修改、删除的文件清单。
--abbrev-commit仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。
--relative-date使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。
--graph在日志旁以 ASCII 图形显示分支与合并历史。
--pretty使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。
--oneline--pretty=oneline --abbrev-commit 合用的简写。

定制输出格式,git log --pretty=format 常用的选项

选项说明
%H提交的完整哈希值
%h提交的简写哈希值
%T树的完整哈希值
%t树的简写哈希值
%P父提交的完整哈希值
%p父提交的简写哈希值
%an作者名字
%ae作者的电子邮件地址
%ad作者修订日期(可以用 –date=选项 来定制格式)
%ar作者修订日期,按多久以前的方式显示
%cn提交者的名字
%ce提交者的电子邮件地址
%cd提交日期
%cr提交日期(距今多长时间)
%s提交说明

限制 git log 输出的选项、

选项说明
-<n>仅显示最近的 n 条提交。
--since, --after仅显示指定时间之后的提交。
--until, --before仅显示指定时间之前的提交。
--author仅显示作者匹配指定字符串的提交。
--committer仅显示提交者匹配指定字符串的提交。
--grep仅显示提交说明中包含指定字符串的提交。
-S仅显示添加或删除内容匹配指定字符串的提交。

awk相关命令

awk的基本语法

1
2
3
4
5
6
7
8
9
awk -F|-f|-v 'BEGIN{ } / / {comand1;comand2} END{ }' file
-F 定义列分隔符
-f 指定调用脚本
-v 定义变量
' '引用代码块,awk执行语句必须包含在内
BEGIN{ } 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
{ } 命令代码块,包含一条或多条命令
// 用来定义需要匹配的模式(字符串或者正则表达式),对满足匹配模式的行进行上条代码块的操作
END{ } 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息

关于字段列表

1
2
$ echo 'this is a test' | awk '{print $0}'
this is a test

上面代码中,print $0就是把标准输入this is a test,重新打印了一遍。

awk会根据空格和制表符,将每一行分成若干字段,依次用$1、$2、$3代表第一个字段、第二个字段、第三个字段等等。

1
2
>$ echo 'this is a test' | awk '{print $3}'
a

shell脚本的编写

把以上命令封装成脚本,实现作者、工程目录、始末时间、查询提交说明中关键字tag等自由配置的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
### configuration ###
# your git name.
NAME=Nova
# your git project path. eg: WORK_PATH="F:\Users\Nova\IdeaProjects\mhgu"
WORK_PATH="F:\Users\Nova\IdeaProjects\mhgu"
# start time is allowed to be null. eg: begin_time=2021-01-01
BEGIN_TIME=
# end time is allowed to be null. eg: end_time=2022-04-01
END_TIME=
# tag is allowed to be null, it will be used to search your commit message. eg: TAG="Equip Moudle"
TAG=

### ==================== authored by tanghao ==================== ###
GIT_STR="git log --pretty=tformat: --numstat"
NAME_STR="author=${NAME}"
BEGIN_STR="since=${BEGIN_TIME}"
END_STR="until=${END_TIME}"
GREP_STR="grep=${TAG}"
PARAM_OPERATOR="--"
PIPE_OPERATOR="|"
AWK_STR="awk '{add += \$1; subs += \$2} END {printf \"added lines: %s, removed lines: %s\", add, subs}'"

function GetFinalGitStr() {
if [[ -n ${NAME} ]]; then
GIT_STR="${GIT_STR} ${PARAM_OPERATOR}${NAME_STR}"
fi
if [[ -n ${BEGIN_TIME} ]]; then
GIT_STR="${GIT_STR} ${PARAM_OPERATOR}${BEGIN_STR}"
fi
if [[ -n ${END_TIME} ]]; then
GIT_STR="${GIT_STR} ${PARAM_OPERATOR}${END_STR}"
fi
if [[ -n ${TAG} ]]; then
GIT_STR="${GIT_STR} ${PARAM_OPERATOR}${GREP_STR}"
fi
}

if [ -n ${WORK_PATH} ]; then
cd ${WORK_PATH}
fi

GetFinalGitStr
COMMAND="${GIT_STR} ${PIPE_OPERATOR} ${AWK_STR}"
echo "${NAME_STR}"
echo "path=${WORK_PATH}"
echo "${BEGIN_STR}"
echo "${END_STR}"
echo "tag=${TAG}"
printf "\n"
eval ${COMMAND}
read

统计git提交代码行数
https://honosv.github.io/2022/02/20/统计git提交代码行数/
作者
Nova
发布于
2022年2月20日
许可协议