我如何searchGit分支文件或目录?

在Git中,我怎么能通过多个分支的pathsearch文件或目录?

我已经写了一个分支,但我不记得哪一个。 现在我需要find它。

澄清 :我正在寻找一个我在我的分支上创build的文件。 我想findpath,而不是内容,因为我不记得内容是什么。

git log会为你find它:

% 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 

也支持globbing:

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

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

git ls-tree可能会有帮助。 search所有现有的分支机构:

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

这样做的好处是你也可以使用正则expression式search文件名。

虽然@ididak的回应非常酷,@ Handyman5提供了一个脚本来使用它,但是我发现这个方法很less受到限制。

有时你需要search一些可能随着时间的推移而出现/消失的东西,为什么不search所有的提交呢? 除此之外,有时你需要一个详细的响应,其他时间只有提交匹配。 这里有两个版本的选项。 把这些脚本放在你的path上:

混帐查找文件

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

混帐find的文件,详细

 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你可以修改该脚本来交替search所有提交,refs,refs / heads,被详细的等等。

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

签出https://github.com/albfan/git-find-file可能的实现;

您可以使用gitk --all并search提交“触摸path”和您感兴趣的path名。

复制并粘贴这个使用git find-file SEARCHPATTERN

打印所有search的分支:

 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别名 。

git仓库find命令的一个相当不错的实现可以在这里find: https : //github.com/mirabilos/git-find