假设我在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命令来做这件事,但我希望避免扫描所有子目录来查找文件名的实例。
发布于 2011-04-16 03:51:37
git ls-files
将为您提供存储库当前状态(缓存或索引)下的所有文件的列表。您可以传入一个模式来获取与该模式匹配的文件。
git ls-files HelloWorld.pm '**/HelloWorld.pm'
如果您想要查找一组文件并通过它们的内容进行grep,可以使用git grep
来实现
git grep some-string -- HelloWorld.pm '**/HelloWorld.pm'
发布于 2011-08-06 01:18:04
嗯,最初的问题是关于存储库的。一个存储库包含多个提交(至少在一般情况下),但在搜索之前给出的答案仅通过一次提交。
因为我找不到一个真正搜索整个提交历史的答案,所以我写了一个快速的暴力脚本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所能做的相反。但到目前为止,它还只是一种想法。
发布于 2008-11-10 10:34:55
尝试:
git ls-tree -r HEAD | grep HelloWorld.pm
https://stackoverflow.com/questions/277546
复制相似问题