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

时间:2008-12-16 20:02:04

标签: git branch

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

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

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

6 个答案:

答案 0 :(得分:377)

git log会为你找到它:

% git log --all -- somefile

commit 55d2069a092e07c56a6b4d321509ba7620664c63
Author: Dustin Sallings <dustin@spy.net>
Date:   Tue Dec 16 14:16:22 2008 -0800

    added somefile
% git branch -a --contains 55d2069
  otherbranch

也支持通配:

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

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

答案 1 :(得分:60)

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 '<foo>'
done

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

答案 2 :(得分:17)

虽然ididak's response很酷,而且 Handyman5 提供了一个使用它的脚本,但我发现使用这种方法有点限制。

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

<强> GIT中找到的文件

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

<强> GIT中找到的文件-详细

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

现在你可以做到

$ git find-file <regex>
sha1
sha2

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

请参阅使用getopt,您可以修改该脚本以交替搜索所有提交,引用,引用/头部,详细等等。

$ git find-file <regex>
$ git find-file --verbose <regex>
$ git find-file --verbose --decorated --color <regex>

结帐https://github.com/albfan/git-find-file以了解可能的实施方式。

答案 3 :(得分:9)

您可以使用gitk --all并搜索提交“触摸路径”以及您感兴趣的路径名。

答案 4 :(得分:5)

复制&amp;将其粘贴以使用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; :'

这些命令会将~/.gitconfig的{​​{1}}直接添加到global git alias

答案 5 :(得分:-1)

可以在此处找到Git存储库的find命令的相当不错的实现:

https://github.com/mirabilos/git-find