只是说我在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
如何使用Git有效地查找与给定文件名匹配的所有完整路径?
我意识到我可以使用Linux/Unix find命令执行此操作,但我希望避免扫描所有子目录以查找文件名实例.
git ls-files
将为您提供存储库中所有文件的列表.您可以传递模式以获取与该模式匹配的文件.
git ls-files '*/HelloWorld.pm'
如果您想查找一组文件并通过其内容进行grep,您可以使用以下命令git grep
:
git grep some-string -- '*/HelloWorld.pm'
嗯,最初的问题是关于存储库.存储库包含多于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 *
也许有更优雅的方式.
请注意参数传递给grep的简单方法,因此它将匹配部分文件名.如果不希望锚定搜索表达式和/或添加合适的grep选项.
对于深度历史记录,输出可能太嘈杂,我想到了一个将修订列表转换为范围的脚本,就像git rev-list可以做的那样.但到目前为止,它仍然是一个想法.
尝试:
git ls-tree -r HEAD | grep HelloWorld.pm
git ls-files | grep -i HelloWorld.pm
grep -i使grep不区分大小写.