You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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[*]}"

脚本说明:

  1. 参数检查:先确保用户传入了正确的文件名参数,避免无意义的执行。
  2. 提交次数统计:用git log --pretty=format:"%h"只输出提交的哈希值(每个提交占一行),再通过wc -l统计行数,就是该行被修改的提交次数。
  3. 结果输出:把每行的次数存入数组,最后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:01:34