是否有一个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
有更好的方法吗?
"更好";在…的眼中。。。runner,但您可以使用git log
和head
或tail
执行此操作。我们从基本的开始:
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
可以快速消除非候选,但有时可能会更慢。