You need to enable JavaScript to run this app. 如何在git日志中查询多次提交里特定JSON属性的变更记录?
优惠活动
大模型
产品
解决方案
定价
更多

如何在git日志中查询多次提交里特定JSON属性的变更记录?

Git 跟踪JSON文件指定属性变更的解决方案

核心逻辑不依赖行号对比,而是直接解析每个提交版本的JSON内容,提取指定属性后对比值差异,完全不受JSON格式排版、属性顺序变化的影响。

前置依赖

安装轻量JSON处理工具jq,可通过各系统包管理器(brew/apt/yum等)直接安装。

具体实现步骤

  1. 预先定义需要跟踪的属性路径,嵌套属性用.分隔路径(如示例中的group.attr1对应嵌套在group下的attr1)
  2. 拉取对应提交版本的JSON文件内容,预处理兼容非标准JSON格式(如末尾多余逗号)
  3. 用jq提取指定属性的取值,跨版本对比后仅输出值发生变化的属性

单文件双提交对比脚本示例

# 配置项:按需修改
# 需要跟踪的JSON属性路径
TRACK_ATTRS=("group.attr1" "group.attr2" "attr3" "attr4")
# 要对比的两个提交引用,支持哈希/HEAD~N等写法
OLD_COMMIT="替换为commit A的哈希或相对引用"
NEW_COMMIT="替换为commit B的哈希或相对引用"
# 目标JSON文件路径
TARGET_FILE="替换为你的JSON文件路径"

# 输出变更结果
echo "${TARGET_FILE} Changes:"
for attr in "${TRACK_ATTRS[@]}"; do
    # 提取旧版本属性值,解析失败默认输出null
    old_val=$(git show "${OLD_COMMIT}:${TARGET_FILE}" | sed 's/,\s*}/}/g' | sed 's/,\s*]/]/g' | jq -r "${attr}" 2>/dev/null || echo "null")
    # 提取新版本属性值
    new_val=$(git show "${NEW_COMMIT}:${TARGET_FILE}" | sed 's/,\s*}/}/g' | sed 's/,\s*]/]/g' | jq -r "${attr}" 2>/dev/null || echo "null")
    # 仅输出值发生变化的属性
    if [ "${old_val}" != "${new_val}" ]; then
        # ${attr#*.} 用于去掉前缀路径,把group.attr1转为attr1,需要保留完整路径可删除该处理
        printf "    %s: \"%s\" to \"%s\"\n" "${attr#*.}" "${old_val}" "${new_val}"
    fi
done

扩展场景适配

  • 多文件批量对比:外层新增一层循环遍历所有目标JSON文件路径即可
  • 跨多提交遍历:先用git log --pretty=format:%H 提交范围获取所有提交哈希,相邻两个提交逐个对比即可
  • 非标准JSON兼容:脚本中已加入sed预处理逻辑,适配存在末尾多余逗号的非规范JSON文件

内容的提问来源于stack exchange,提问作者user-is-here

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 15:18:01