如何查看Git追踪文件相对于指定日期的总变更单词数
如何在Git中统计指定时间以来的文件单词变更量
针对你追踪写作进度的需求,我们可以通过Git命令组合实现当前文件状态与指定时间戳前最新提交的单词增减统计,具体步骤如下:
1. 定位指定时间前的最新提交
首先需要找到目标文件在指定时间(比如昨日下午2点)之前的最后一次提交,我们可以用git log命令精准定位:
# 获取file.txt在昨日14:00前的最新提交短哈希 COMMIT_HASH=$(git log -1 --before="yesterday 14:00" --format="%h" -- file.txt)
-1:只返回最近的1条提交记录--before="yesterday 14:00":指定时间阈值,支持多种格式(比如"2024-05-20 14:00"、"2 hours ago")--format="%h":仅输出提交的短哈希值,方便后续引用-- file.txt:限定只查询该文件的提交记录
如果指定时间前没有该文件的提交,COMMIT_HASH会为空,我们可以加个判断避免后续命令出错:
if [ -z "$COMMIT_HASH" ]; then echo "⚠️ 指定时间前未找到file.txt的相关提交" exit 1 fi
2. 统计单词增减量
接下来对比当前文件状态(包括未提交的变更)与目标提交的差异,分别统计新增和删除的单词数:
# 统计新增单词数:过滤diff中的新增行(排除diff头部的文件名行),再统计单词数 ADD_WORDS=$(git diff $COMMIT_HASH -- file.txt | grep '^+' | grep -v '^+++' | wc -w) # 统计删除单词数:同理过滤删除行,排除diff头部行 DEL_WORDS=$(git diff $COMMIT_HASH -- file.txt | grep '^-' | grep -v '^---' | wc -w) # 输出格式化结果 echo "+$ADD_WORDS/-$DEL_WORDS"
关键细节说明:
git diff $COMMIT_HASH -- file.txt:生成当前文件与目标提交的差异对比grep '^+':筛选出所有以+开头的新增内容行,grep -v '^+++'排除diff头部的+++ b/file.txt行(这行不是内容变更)wc -w:统计筛选后内容的单词数量(按空白字符分隔,符合写作场景的单词统计逻辑)
3. 完整脚本封装
把上面的命令整合成一个可复用的脚本(比如git-word-diff.sh),方便日常使用:
#!/bin/bash # 检查参数是否齐全 if [ $# -ne 2 ]; then echo "用法: $0 <文件路径> <时间阈值>" echo "示例: $0 file.txt \"yesterday 14:00\"" exit 1 fi FILE=$1 TIME=$2 COMMIT_HASH=$(git log -1 --before="$TIME" --format="%h" -- "$FILE") if [ -z "$COMMIT_HASH" ]; then echo "⚠️ 指定时间前未找到$FILE的相关提交" exit 1 fi ADD_WORDS=$(git diff $COMMIT_HASH -- "$FILE" | grep '^+' | grep -v '^+++' | wc -w) DEL_WORDS=$(git diff $COMMIT_HASH -- "$FILE" | grep '^-' | grep -v '^---' | wc -w) echo "$FILE 相对于$TIME的单词变更: +$ADD_WORDS/-$DEL_WORDS"
给脚本添加执行权限后即可使用:
chmod +x git-word-diff.sh ./git-word-diff.sh file.txt "yesterday 14:00"
注意事项
- 如果需要统计暂存区与目标提交的差异,把
git diff换成git diff --cached即可 wc -w的统计逻辑是按空白分隔,对于包含连字符、缩写的单词可能会有微小误差,但基本满足写作进度追踪的需求- 时间阈值支持Git的所有合法时间格式,比如
"last week"、"2024-05-20T14:00:00"
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

