惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
云风的 BLOG
云风的 BLOG
人人都是产品经理
人人都是产品经理
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
J
Java Code Geeks
博客园 - 聂微东
B
Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
WordPress大学
WordPress大学
腾讯CDC
L
LangChain Blog
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Azure Blog
Microsoft Azure Blog
D
DataBreaches.Net
The GitHub Blog
The GitHub Blog
美团技术团队
博客园 - Franky
Google DeepMind News
Google DeepMind News
V
V2EX
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
The Cloudflare Blog

OhYee 博客

小鹏辅助驾驶测评|OhYee 博客 小鹏非支持手机开启自动解锁|OhYee 博客 使用函数计算实现 301 重定向|OhYee 博客 针对 HTML 内容使用 Ant Design 图片弹框|OhYee 博客 博客进程泄露及僵尸进程解决|OhYee 博客 蓝易云服务器体验|OhYee 博客 SSH 调起本地 VSCode|OhYee 博客 【2022 秋招内推】阿里云后端研发工程师|OhYee 博客 使用函数计算获取 IP 地址信息|OhYee 博客 正确获取客户端 IP/HTTP Header 也可能重复|OhYee 博客 评测 Oculus Quest2 及 BigScreen|OhYee 博客 NextJS 热重载保留状态|OhYee 博客 如何优雅地贴 gist 代码|OhYee 博客 Linux 精细化文件权限|OhYee 博客 VSCode 容器开发环境|OhYee 博客 Clash 的不兼容更新排查|OhYee 博客 Zeek 导出 PCAP|OhYee 博客 记一次 ssh 配置问题|OhYee 博客 Git Commit 规范化工具|OhYee 博客 谈谈《星之卡比-探索发现》|OhYee 博客 VSCode 快捷键绑定 Shell 命令|OhYee 博客 ASN.1 语法及 X.509 证书格式解析解析|OhYee 博客 腾讯企业邮箱忽略 MX 记录发信|OhYee 博客 Chrome/Edge 标签组插件|OhYee 博客 【应届内推】阿里云后端研发工程师|OhYee 博客 损坏的 Typecho 备份处理为 JSON|OhYee 博客 VS Code VIM 插件高效使用|OhYee 博客 SSH 正反向代理|OhYee 博客 Let's Encrypt 根证书过期引发的问题|OhYee 博客 OpenWRT 忽略内核依赖|OhYee 博客
统计Git中代码增删行数与awk的使用|OhYee 博客
2018-11-19 · via OhYee 博客

单纯的代码统计只是统计了当前使用的代码,但是这不代表删去的代码就没有意义,因此统计工作量有时候也需要考虑git增删行数

这是一篇最后编辑于 8 年前 的文章,其内容可能与目前实际情况差异较大,请注意甄别

在网上很容易就可以搜到相关的代码,现在予以分析

首先先拿一个可以运行的代码出来:

git log --pretty=tformat: --numstat | awk '{add+=$1;subs+=$2;}END{printf "+%s -%s %s",add,subs,add-subs}'

语句共分为两部分:

  1. git log 按格式输出行数统计
  2. awk 按照管道输出逐行统计

首先,--pretty是按照要求输出log内容。
常用的是--pretty:oneline,这样只输出哈希值和commit信息
--pretty:format--pretty:tformat则是按照自定义格式输出内容的命令
常用的转义字符有

转义字符 含义
%s commit信息
%h 简短hash值
%H 完整hash值
%an 作者名字
%ae 作者邮箱
%ad 作者修订日期
%cn 提交者名字
%ce 提交者邮箱
%cd 提交日期

当然,这些内容属于标题,也即第一行的内容。具体的文件变动不会显示。
因此,需要配合别的指令显示具体的操作

转义字符 含义
--graph 图形方式的log
--stat 所有文件的增减行数统计信息
--shortstat 简短的文件行数信息
--name-only 只显示涉及的文件名
--name-status 增删改分类的文件名
--numstat 增删行数与文件名

结合上面两者,就可以完美显示出每次commit的信息以及变动内容。
当format后的自定义信息为空时,相当于不存在标题行,这时,如果是--pretty:format:则会输出一个空行,--pretty:tformat:则不会有空行。

那么要输出行数信息,就很明显,应该使用--pretty:tformat: --numstat或者--pretty:tformat: --shortstat
前者行数多,但处理方便;后者行数少,但不宜处理

前者的输出内容大致是

git log --pretty=tformat: --numstat
1       0       .gitignore
3       1       config.py
1       1       stop.sh
0       0       OBlog/templates/layout/{robot.txt => robots.txt}
2       2       OBlog/views.py
30      28      OBlog/static/js/local.js
1       4       OBlog/templates/layout/comments.js
1       2       OBlog/templates/pages/index.html
26      25      OBlog/templates/pages/404.html
2       2       OBlog/templates/layout/jscss.html
……

后者则是

git log --pretty=tformat: --shortstat
 3 files changed, 5 insertions(+), 2 deletions(-)
 2 files changed, 2 insertions(+), 2 deletions(-)
 3 files changed, 32 insertions(+), 34 deletions(-)
 1 file changed, 26 insertions(+), 25 deletions(-)
 1 file changed, 2 insertions(+), 2 deletions(-)
……

这样,我们就获得了每次提交的变更的代码行数。
剩下的只需要统计每行的信息即可。

要按行执行指令,则要用到awk
通过|将指令连接,awk可以逐行执行指定命令。
逐行输出:awk '{print $0}
逐行输出空格分隔后的第一个参数:awk '{print $1}

同理,要求和第一个参数就是 awk '{add+=$1}'
然后我们则需要在最后输出值,要用到END{},这表示只在运行结束时执行。
awk '{add+=$1;subs+=$2}END{printf "+%s -%s",add,subs}'
这样就实现了增删行数的统计。