Git提交历史换行显示及统计文件每行修改提交次数的脚本问题
问题1:让Git提交历史每个提交单独占一行
你遇到的提交记录挤在一行的问题,核心原因是脚本里用了echo $(git log ...)的写法——$(...)会把命令输出中的所有换行符替换成空格,直接把多个提交的记录合并成了一行。
要让每个提交单独占一行,只需要调整这行代码:
要么直接执行git log命令,不需要用echo $(...)包裹:
git log --pretty=format:"%h%x09%an%x09%ad%x09%s" -L $CTR,$CTR:"$1"
如果一定要保留echo,记得给$(...)加上双引号,这样就能保留原始输出的换行符:
echo "$(git log --pretty=format:"%h%x09%an%x09%ad%x09%s" -L $CTR,$CTR:"$1")"
这样处理后,每个影响该行的提交就会单独显示在一行里了。
问题2:统计文件每行的提交修改次数
基于上面的格式修正,我们可以直接统计每行对应的提交记录行数,来得到修改次数。这里是完善后的脚本,能直接输出你需要的空格分隔的结果:
#!/bin/bash # 检查是否传入了目标文件参数 if [ $# -ne 1 ]; then echo "Usage: $0 <target-file>" exit 1 fi TARGET_FILE="$1" declare -a line_counts # 遍历文件的每一行 line_num=0 while IFS= read -r _; do ((line_num++)) # 仅统计提交哈希值的行数,避免格式字符干扰统计 commit_count=$(git log --pretty=format:"%h" -L $line_num,$line_num:"$TARGET_FILE" | wc -l) line_counts+=("$commit_count") done < "$TARGET_FILE" # 输出空格分隔的结果 echo "${line_counts[*]}"
脚本说明:
- 参数检查:先确保用户传入了正确的文件名参数,避免无意义的执行。
- 提交次数统计:用
git log --pretty=format:"%h"只输出提交的哈希值(每个提交占一行),再通过wc -l统计行数,就是该行被修改的提交次数。 - 结果输出:把每行的次数存入数组,最后用
echo "${line_counts[*]}"以空格分隔输出所有结果。
比如你提到的5行文件示例,第一行被修改4次,其余行仅在初始提交中添加,脚本会输出4 1 1 1 1,完全符合你的需求。
如果需要排除合并提交,可以在git log命令中添加--no-merges参数,比如:
commit_count=$(git log --no-merges --pretty=format:"%h" -L $line_num,$line_num:"$TARGET_FILE" | wc -l)
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

