Git如何搜索文件所有历史版本并列出匹配搜索条件的提交?
Git遍历指定文件历史版本匹配字符串的实现方案
直接可用的脚本
将下方变量替换为你的实际值后直接执行即可输出所有符合要求的commit SHA:
# 目标文件在仓库中的相对路径 TARGET_FILE="path/to/your/file" # 需要匹配的目标字符串 SEARCH_STR="要搜索的内容" # 遍历该文件所有历史提交校验内容 git log --follow --pretty=format:%H -- "$TARGET_FILE" | while read COMMIT_SHA; do if git show "$COMMIT_SHA:$TARGET_FILE" | grep -qF -- "$SEARCH_STR"; then echo "$COMMIT_SHA" fi done
核心参数说明
--follow:适配文件曾被重命名的场景,可追溯重命名前的文件历史,无该场景可删除grep -qF:-q表示仅返回匹配状态不输出内容,-F表示将搜索内容作为字面量匹配,不会解析字符串内的正则符号,如需正则匹配可删除-F参数- 若需要同时输出提交时间、提交信息等内容,可将
git log的--pretty=format:%H修改为对应格式,例:--pretty=format:"%H %ci %s"可同时输出SHA、提交时间、提交说明
性能优化方案
如果仓库历史悠久、目标文件较大,可使用并行处理加速执行(需环境支持xargs的-P参数):
TARGET_FILE="path/to/your/file" SEARCH_STR="要搜索的内容" export TARGET_FILE SEARCH_STR git log --follow --pretty=format:%H -- "$TARGET_FILE" | xargs -P 10 -I {} sh -c ' if git show "{}:$TARGET_FILE" | grep -qF -- "$SEARCH_STR"; then echo "{}" fi '
其中-P 10表示同时开启10个并行任务,可根据设备性能调整数值。
和原有diff匹配方案的差异
原有仅扫描提交diff的方案,只会匹配到字符串首次被添加、末次被删除的两个边界提交,本方案直接校验每个提交下的文件完整内容,会输出所有包含目标字符串的中间版本提交,完全匹配需求。
内容的提问来源于stack exchange,提问作者Eyal Gerber
相关产品推荐
相关产品推荐

