找到添加了匹配 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 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
可以快速消除 non-candidates,但有时可能会更慢。
是否有 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 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
可以快速消除 non-candidates,但有时可能会更慢。