如何在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
相关产品推荐
相关产品推荐

