首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我可以使用Git在存储库中搜索匹配的文件名吗?

我可以使用Git在存储库中搜索匹配的文件名吗?
EN

Stack Overflow用户
提问于 2008-11-10 10:31:13
回答 6查看 53.5K关注 0票数 78

假设我在Git仓库的多个子目录中有一个文件:"HelloWorld.pm“。

我想发出一个命令来查找与“HelloWorld.pm”匹配的所有文件的完整路径:

例如:

代码语言:javascript
复制
/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命令来做这件事,但我希望避免扫描所有子目录来查找文件名的实例。

EN

回答 6

Stack Overflow用户

发布于 2011-04-16 03:51:37

git ls-files将为您提供存储库当前状态(缓存或索引)下的所有文件的列表。您可以传入一个模式来获取与该模式匹配的文件。

代码语言:javascript
复制
git ls-files HelloWorld.pm '**/HelloWorld.pm'

如果您想要查找一组文件并通过它们的内容进行grep,可以使用git grep来实现

代码语言:javascript
复制
git grep some-string -- HelloWorld.pm '**/HelloWorld.pm'
票数 116
EN

Stack Overflow用户

发布于 2011-08-06 01:18:04

嗯,最初的问题是关于存储库的。一个存储库包含多个提交(至少在一般情况下),但在搜索之前给出的答案仅通过一次提交。

因为我找不到一个真正搜索整个提交历史的答案,所以我写了一个快速的暴力脚本git- find -by-name,它将(几乎)所有提交都考虑在内。

代码语言:javascript
复制
#! /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所能做的相反。但到目前为止,它还只是一种想法。

票数 45
EN

Stack Overflow用户

发布于 2008-11-10 10:34:55

尝试:

代码语言:javascript
复制
git ls-tree -r HEAD | grep HelloWorld.pm
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/277546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档