Answers:
git log
+ git branch
会为您找到:
% 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而不更改git,而不是扩展它(就像Unix一样find
)。
somefile
则此方法有效:例如,如果您需要在路径/文件名上进行正则表达式搜索,则可以使用ididak的答案。
git log --all -- **/my_file.png
git log --grep='branch' --author='me' -- *.sql
。像魅力一样工作。git版本1.7.11.1
gitk
支持通配符。@webmat是一个很好的答案!如果要查看在哪里删除/创建了/ etc,可以使用git log --all --stat -- **/my_file.png
,这样就不必猜测是否要从删除了它的提交中检出它。
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
这样做的好处是您还可以使用正则表达式搜索文件名。
git for-each-ref --format="%(refname)" refs/heads
; do”(c)“ git ls-tree --name-only”将使输出更整齐(d)它可能是值得在你的答案指出,有这样的一个优势达斯汀的解决方案,即你不需要确切地知道文件名-您可以通过正则表达式匹配的路径的任何部分搜索
refs/remotes
代替refs/heads
。要搜索所有内容(本地分支,远程跟踪分支和标签),只需使用refs/
。
尽管ididak的响应非常酷,并且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-find-file-verbose
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以获取可能的实现。
您可以使用gitk --all
并搜索“触摸路径”提交和您感兴趣的路径名。
复制并粘贴以使用 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别名。
find
在这里可以找到用于Git存储库的命令的相当不错的实现: