当前位置:  开发笔记 > 编程语言 > 正文

如何在Git分支中搜索文件或目录?

如何解决《如何在Git分支中搜索文件或目录?》经验,为你挑选了5个好方法。

在Git中,我如何通过多个分支的路径搜索文件或目录?

我在一个分支中写了一些东西,但我不记得是哪一个.现在我需要找到它.

澄清:我正在寻找一个我在其中一个分支上创建的文件.我想通过路径找到它,而不是通过它的内容找到它,因为我不记得内容是什么.



1> Dustin..:

git log会为你找到它:

% git log --all -- somefile

commit 55d2069a092e07c56a6b4d321509ba7620664c63
Author: Dustin Sallings 
Date:   Tue Dec 16 14:16:22 2008 -0800

    added somefile


% git branch -a --contains 55d2069
  otherbranch

也支持globbing:

% git log --all -- '**/my_file.png'

单引号是必要的(至少如果使用bash shell),所以shell将glob模式传递给git不变,而不是扩展它(就像使用Unix一样git log).


也支持globbing:`git log --all - **/my_file.png`
我用它来解决一个稍微不同的问题.我试图找到我已经提交给特定分支的所有*.sql文件.所以我用`git log --grep ='branch' - author ='me' - *.sql`.工作就像一个魅力.git版本1.7.11.1
如果你知道`somefile`的确切路径,这是有效的:例如,如果你需要在路径/文件名上进行正则表达式搜索,那么你可以使用ididak的答案.
@webmat不在git 1.7.0.4中

2> ididak..:

git ls-tree可能有所帮助.要搜索所有现有分支:

for branch in `git for-each-ref --format="%(refname)" refs/heads`; do
  echo $branch :; git ls-tree -r --name-only $branch | grep ''
done

这样做的好处是您还可以使用正则表达式搜索文件名.


我把它包装在一个脚本中,这样你就可以运行"gitfind.sh "; 要点是https://gist.github.com/62d981890eccb48a99dc
请注意,这只会搜索*local*分支.要搜索远程跟踪分支,请使用`refs/remotes`而不是`refs/heads`.要搜索所有内容(本地分支,远程跟踪分支和标记),只需使用`refs /`.
一些有希望的有用的评论:(a)您可能希望将"-r"添加到"git ls-tree",以便即使它位于子目录中也能找到该文件.(b)第一行的一个更简洁的替代方法是使用"git for-each ref",例如"for git for-each-ref --format ="%(refname)"refs/heads`;做"(c)"git ls-tree --name-only"会使输出更整洁(d)你的回答可能值得指出,这比Dustin的解决方案更有优势,即你不需要要准确知道文件名 - 您可以通过匹配路径任何部分的正则表达式进行搜索

3> albfan..:

虽然ididak的响应非常酷,而且Handyman5提供了一个使用它的脚本,但我发现使用这种方法有点受限.

有时您需要搜索可能随着时间的推移出现/消失的内容,那么为什么不搜索所有提交?除此之外,有时您需要详细的响应,有时只需提交匹配.以下是这些选项的两个版本.将这些脚本放在您的路径上:

混帐查找文件

for branch in $(git rev-list --all)
do
  if (git ls-tree -r --name-only $branch | grep --quiet "$1")
  then
     echo $branch
  fi
done

混帐找到的文件,详细

for branch in $(git rev-list --all)
do
  git ls-tree -r --name-only $branch | grep "$1" | sed 's/^/'$branch': /'
done

现在你可以做到

$ git find-file 
sha1
sha2

$ git find-file-verbose 
sha1: path/to//searched
sha1: path/to/another//in/same/sha
sha2: path/to/other//in/other/sha

看到使用getopt,您可以修改该脚本以交替搜索所有提交,引用,引用/头,冗长等.

$ git find-file 
$ git find-file --verbose 
$ git find-file --verbose --decorated --color 

结帐https://github.com/albfan/git-find-file以获得可能的实施方案.



4> Greg Hewgill..:

您可以使用gitk --all和搜索提交"触摸路径"和您感兴趣的路径名.


如上所述,使用gitk --all,然后使用View | 新视图,启用所有分支.然后在倒数第二个字段中设置搜索条件:文件名(带外卡).最后:好的.

5> lumbric..:

复制并粘贴此即可使用 git find-file SEARCHPATTERN

打印所有搜索的分支:

git config --global alias.find-file '!for branch in `git for-each-ref --format="%(refname)" refs/heads`; do echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; done; :'

仅打印带有结果的分支:

git config --global alias.find-file '!for branch in $(git for-each-ref --format="%(refname)" refs/heads); do if git ls-tree -r --name-only $branch | grep "$1" > /dev/null; then  echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; fi; done; :'

这些命令将直接添加一些最起码的shell脚本到你~/.gitconfig作为全球git的别名.

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