只是说我在Git存储库中的多个子目录中有一个文件:"HelloWorld.pm".
我想发出一个命令来查找匹配"HelloWorld.pm"的所有文件的完整路径:
例如:
/path/to/repository/HelloWorld.pm
/path/to/repository/but/much/deeper/down/HelloWorld.pm
/path/to/repository/please/dont/make/me/search/through/the/lot/HelloWorld.pm
Run Code Online (Sandbox Code Playgroud)
如何使用Git有效地查找与给定文件名匹配的所有完整路径?
我意识到我可以使用Linux/Unix find命令执行此操作,但我希望避免扫描所有子目录以查找文件名实例.
Bri*_*ell 103
git ls-files
将为您提供存储库中所有文件的列表.您可以传递模式以获取与该模式匹配的文件.
git ls-files '*/HelloWorld.pm'
Run Code Online (Sandbox Code Playgroud)
如果您想查找一组文件并通过其内容进行grep,您可以使用以下命令git grep
:
git grep some-string -- '*/HelloWorld.pm'
Run Code Online (Sandbox Code Playgroud)
Uwe*_*der 44
嗯,最初的问题是关于存储库.存储库包含多于1个提交(至少在一般情况下),但是在仅通过一次提交搜索之前给出的答案.
因为我找不到真正搜索整个提交历史的答案,所以我写了一个快速的暴力脚本git-find-by-name,它将(几乎)所有提交都考虑在内.
#! /bin/sh
tmpdir=$(mktemp -td git-find.XXXX)
trap "rm -r $tmpdir" EXIT INT TERM
allrevs=$(git rev-list --all)
# well, nearly all revs, we could still check the log if we have
# dangling commits and we could include the index to be perfect...
for rev in $allrevs
do
git ls-tree --full-tree -r $rev >$tmpdir/$rev
done
cd $tmpdir
grep $1 *
Run Code Online (Sandbox Code Playgroud)
也许有更优雅的方式.
请注意参数传递给grep的简单方法,因此它将匹配部分文件名.如果不希望锚定搜索表达式和/或添加合适的grep选项.
对于深度历史记录,输出可能太嘈杂,我想到了一个将修订列表转换为范围的脚本,就像git rev-list可以做的那样.但到目前为止,它仍然是一个想法.