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

如何在Git全量提交中搜索含多字符串且有未变更内容限制的变更

Git 多关键词提交搜索实现方案

现有如下命令可搜索涉及foo的提交变更:

$ git log -S foo

需求说明

  • 搜索涉及foo和bar的变更
  • 确保变更发生在同时包含两个匹配模式的文件中,即便本次变更仅涉及其中一个模式
  • 搜索范围包含归档和未归档分支的所有提交

完整实现脚本

以下是补全后的可直接运行的shell脚本:

#!/bin/bash
# 替换为你的git仓库实际路径
GITDIR="/path/to/your/git/repo"

cd "$GITDIR" || exit 1

# 拉取所有分支的全部提交哈希,覆盖归档、未归档分支
declare -a myhashes=($(git log --all --pretty=%H))

for myhash in "${myhashes[@]}";do
    # 筛选出当前提交中修改过foo或bar内容的文件列表
    declare -a myfiles=($(git diff --pickaxe-regex -S "foo|bar" --name-only "$myhash"^ "$myhash"))
    if [ ${#myfiles[@]} -eq 0 ]; then
        continue
    fi

    # 筛选出当前提交中包含foo的文件
    declare -a fwf=($(git grep -l -e foo "$myhash" -- "${myfiles[@]}"))
    # 筛选出当前提交中包含bar的文件
    declare -a fwb=($(git grep -l -e bar "$myhash" -- "${myfiles[@]}"))

    # 求两个文件数组的交集,得到同时包含foo和bar的文件列表
    declare -a common_files=($(echo "${fwf[@]}" "${fwb[@]}" | tr ' ' '\n' | sort | uniq -d))

    # 只要存在符合要求的文件,就打印提交信息
    if [ ${#common_files[@]} -gt 0 ]; then
        echo "匹配提交:$myhash"
        echo "符合要求的文件:${common_files[*]}"
        # 可选:打印提交的摘要信息
        git show --stat "$myhash" | head -5
        echo "--------------------------"
    fi
done

注意事项

  • 脚本中的GITDIR需要替换为你本地Git仓库的实际路径
  • 如果需要修改匹配关键词,直接替换-S "foo|bar"、-e foo、-e bar三处的对应内容即可
  • 若要调整输出内容,可以修改最后的打印逻辑,比如增删提交信息的展示字段

内容的提问来源于stack exchange,提问作者mkk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:39:02