如何在git日志中查询多次提交里特定JSON属性的变更记录?
Git 跟踪JSON文件指定属性变更的解决方案
核心逻辑不依赖行号对比,而是直接解析每个提交版本的JSON内容,提取指定属性后对比值差异,完全不受JSON格式排版、属性顺序变化的影响。
前置依赖
安装轻量JSON处理工具jq,可通过各系统包管理器(brew/apt/yum等)直接安装。
具体实现步骤
- 预先定义需要跟踪的属性路径,嵌套属性用
.分隔路径(如示例中的group.attr1对应嵌套在group下的attr1) - 拉取对应提交版本的JSON文件内容,预处理兼容非标准JSON格式(如末尾多余逗号)
- 用
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
相关产品推荐
相关产品推荐

