当前位置:  开发笔记 > 运维 > 正文

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

如何解决《我可以使用Git在存储库中搜索匹配的文件名吗?》经验,为你挑选了4个好方法。

只是说我在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命令执行此操作,但我希望避免扫描所有子目录以查找文件名实例.



1> Brian Campbe..:

git ls-files将为您提供存储库中所有文件的列表.您可以传递模式以获取与该模式匹配的文件.

git ls-files '*/HelloWorld.pm'

如果您想查找一组文件并通过其内容进行grep,您可以使用以下命令git grep:

git grep some-string -- '*/HelloWorld.pm'


'git ls-files'不会列出存储库中的文件.它列出了索引(临时区域)或工作树中的文件名.文件名在存储库中的某个位置而不是在索引或工作树中是完全正常的 - 例如,文件名可能位于与当前检出的分支不同的分支上.@GregHewgill的答案在这里应该被认为更正确.

2> Uwe Geuder..:

嗯,最初的问题是关于存储库.存储库包含多于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 rev-list --all | xargs -I'{}'git ls-tree --full-tree -r'{}'| grep'.*HelloWorld\.pm $'`.这也解决了硬盘驱动器泛滥问题.

3> Greg Hewgill..:

尝试:

git ls-tree -r HEAD | grep HelloWorld.pm



4> Bull..:
git ls-files | grep -i HelloWorld.pm

grep -i使grep不区分大小写.

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有