找到添加了匹配 glob 模式的文件的 Git 提交

Find the Git commit that added a file matching a glob pattern

是否有 Git 命令可以找到第一个添加了与模式匹配的文件的提交?

例如,假设我想找到第一个添加与模式 path/prefix/*/subpath/* 匹配的文件的提交。我发现可以通过组合 git rev-list 来查找在固定路径下添加文件的提交(例如 path/prefix),迭代提交以列出他们通过 git diff-tree 添加的文件来完成,并使用 grep 查找与给定模式匹配的文件(例如,/subpath/):

for COMMIT in $(git rev-list \
                    --reverse \
                    --topo-order \
                    HEAD \
                    path/prefix)
do
  git diff-tree \
    --diff-filter A \
    --name-only \
    --no-commit-id \
    -r "${COMMIT}" |
  grep -q "/subpath/" && echo "${COMMIT}" && break
done

有没有更好的方法?

“更好”在跑步者的眼中,但您可以使用 git logheadtail 来做到这一点。我们从基础开始:

git log <options> --diff-filter=A --format=%H -- 'path/prefix/*/subpath/*'

转出 所有 哈希 ID(如果需要,添加 --topo-order,如果需要,添加 --reverse)。然后我们只剪掉最后一个(如果不使用 --reverse)或第一个(如果使用 --reverse):

(the git log command) | tail -n 1

这通常会 更快 因为 git log 可以快速消除 non-candidates,但有时可能会更慢。