git 统计一段时间内的代码行数,包括文件格式过滤

本文详细介绍了一种使用Git命令进行复杂日志查询的方法,包括指定作者、日期范围及文件类型过滤,通过管道命令组合实现数据整理与统计,适用于软件开发团队对代码变更的精细化分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

git log --author=liuyufeng --since=2020-03-07 --until=2020-03-13 --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --n
umstat | grep "\(|.c++\|.h\|.pro\)$" | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; don
e                                                                                                                                                                                   
<think>我们被要求使用Git命令统计一段时间内提交的代码行数。根据提供的引用,有多种方法可以实现这个目标。 主要思路是使用`git log`命令,结合时间范围(--since和--until或--before)以及统计选项(--numstat),然后通过awk或类似工具汇总数据。 根据引用[1][2][3][5],常见的命令结构如下: git log --since=<开始日期> --until=<结束日期> --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "新增行数: %s, 删除行数: %s, 总行数: %s\n", add, subs, loc }' 注意: - --since 和 --until 指定时间范围,格式为YYYY-MM-DD,也可以使用相对日期(如1.week.ago)。 - --pretty=tformat: 用于指定输出格式,这里使用--numstat会输出每个文件的变更行数(增加和删除)。 - 然后通过awk累加增加行数($1)、删除行数($2)以及净增行数($1-$2)。 但是,引用[1][2][3]中提到了按作者统计,而用户的问题只是统计某段时间内所有提交的代码行数,不限定作者。因此我们可以省略--author参数。 另外,引用[5]中使用了`grep java`来过滤特定文件类型,但用户没有指定文件类型,所以也可以省略。 因此,我们可以给出如下基本命令: ```bash git log --since="开始日期" --until="结束日期" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "新增行数: %s, 删除行数: %s, 总行数: %s\n", add, subs, loc }' ``` 注意:这里的“总行数”是指净增行数(即增加行数减去删除行数)。 但是,需要注意:--numstat输出的每行有三个字段:增加行数、删除行数和文件路径。如果某个文件是二进制文件,则增加和删除行数会显示为“-”,这会导致awk计算错误(因为字符串无法参与算术运算)。因此,我们需要过滤这些行。 我们可以修改awk命令,只处理数字行。例如: ```bash git log --since="开始日期" --until="结束日期" --pretty=tformat: --numstat | awk '{ if ($1 != "-" && $2 != "-") { add += $1; subs += $2; loc += $1 - $2 } } END { printf "新增行数: %s, 删除行数: %s, 总行数: %s\n", add, subs, loc }' ``` 或者,我们可以使用grep过滤包含非数字的行(但注意--numstat输出的行可能包含二进制文件,其行数为“-”)。我们可以先过滤含有“-”的行,或者只选择包含数字的行: ```bash git log --since="开始日期" --until="结束日期" --pretty=tformat: --numstat | grep -v "\-\s*\-\s*" | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "新增行数: %s, 删除行数: %s, 总行数: %s\n", add, subs, loc }' ``` 但更简单的方法是让awk跳过那些包含非数字的行: ```bash git log --since="开始日期" --until="结束日期" --pretty=tformat: --numstat | awk '/^[0-9]+[[:space:]]+[0-9]+/ { add += $1; subs += $2; loc += $1 - $2 } END { printf "新增行数: %s, 删除行数: %s, 总行数: %s\n", add, subs, loc }' ``` 这个awk命令只处理以数字开头(接着空格和数字)的行,这样二进制文件的行就被跳过了。 另外,时间格式也可以使用--before,但通常--since和--until是一对。注意:--until和--before是等价的。 如果用户想要按作者统计,可以在命令中加入--author="作者名",但这里用户没有要求,所以省略。 示例:统计2025年1月1日到2025年1月22日的代码行数 ```bash git log --since="2025-01-01" --until="2025-01-22" --pretty=tformat: --numstat | awk '/^[0-9]+[[:space:]]+[0-9]+/ { add += $1; subs += $2; loc += $1 - $2 } END { printf "新增行数: %s, 删除行数: %s, 总行数: %s\n", add, subs, loc }' ``` 注意:这个命令会统计所有分支的提交。如果想统计特定分支,可以在命令最后加上分支名,例如:`git log --since=... --until=... origin/dev` 另外,引用[4]展示了一个自定义git别名的方法,但用户只需要命令,所以我们可以先提供直接命令。 因此,针对用户的问题,我们给出如下解答:</think>### Git 统计指定时间段内代码提交行数 要统计 Git 仓库中某段时间内的代码提交行数(包括新增、删除和净变更行数),可以使用以下命令模板: ```bash git log --since="起始时间" --until="结束时间" --pretty=tformat: --numstat \ | awk '/^[0-9]+[[:space:]]+[0-9]+/ { add += $1; del += $2 } END { printf "新增行数: %s\n删除行数: %s\n净增行数: %s", add, del, add-del }' ``` #### 参数说明: - `--since="YYYY-MM-DD"`:统计起始时间(含) - `--until="YYYY-MM-DD"`:统计截止时间(含) - `--pretty=tformat: --numstat`:输出变更统计表格 - `awk`:汇总数据计算结果 #### 使用示例: 统计 **2024 年 1 月 1 日 至 2024 年 1 月 31 日** 的代码变更: ```bash git log --since="2024-01-01" --until="2024-01-31" --pretty=tformat: --numstat \ | awk '/^[0-9]+[[:space:]]+[0-9]+/ { add += $1; del += $2 } END { printf "新增行数: %s\n删除行数: %s\n净增行数: %s", add, del, add-del }' ``` #### 输出示例: ``` 新增行数: 5423 删除行数: 1826 净增行数: 3597 ``` #### 注意事项: 1. **时间格式**:必须使用 `YYYY-MM-DD` 格式(如 `2024-01-01`) 2. **二进制文件**:自动跳过二进制文件变更统计(显示为 `-` 的行) 3. **分支范围**:默认统计当前分支,添加分支名可指定分支(如 `git log origin/main...`) 4. **时区处理**:使用 `--date=iso` 可指定时区(如 `--date=iso8601`) #### 扩展功能: 1. **按作者统计**(引用[^2][^3]): ```bash git log --since="2024-01-01" --until="2024-01-31" --author="开发者姓名" ... ``` 2. **按文件类型统计**(引用[^5]): ```bash git log ... --numstat | grep '\.java$' | awk ... ``` 3. **创建永久别名**(引用[^4]): ```bash git config --global alias.statlines '!f() { git log --since="$1" --until="$2" --pretty=tformat: --numstat | awk "..."; }; f' ``` 使用方式:`git statlines "2024-01-01" "2024-01-31"` > 提示:使用 `git log --stat` 可查看每次提交的变更概览,结合 `--since/--until` 可快速验证时间段设置[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值