在Git中,如何通过路径跨越多个分支来搜索文件或目录?我在一个分支上写了些东西,但是我不记得是哪一个了。现在我需要找到它。
澄清:我正在寻找一个我在我的一个分支上创建的文件。我希望通过路径找到它,而不是通过它的内容,因为我不记得内容是什么。
fquxozlt1#
git log + git branch将为您查找:
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,而不是将其展开(就像Unix find一样)。
find
n9vozmp42#
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
这样做的好处是,您还可以使用正则表达式搜索文件名。
f5emj3cl3#
尽管ididak's response非常酷,而且 * Handyman 5 * 提供了一个脚本来使用它,但我发现使用这种方法有点受限。有时候你需要搜索一些会随着时间的推移而出现或消失的东西,那么为什么不搜索所有的提交呢?除此之外,有时候你需要一个冗长的响应,有时候只需要匹配的提交。下面是这些选项的两个版本。把这些脚本放在你的路径中:
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-文件详细信息
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以获得可能的实现。
xxhby3vn4#
你可以使用gitk --all来搜索提交"接触路径"和你感兴趣的路径名。
gitk --all
(归功于:@MikeW的建议。)
a8jjtwal5#
复制并粘贴以使用git find-file SEARCHPATTERN打印所有搜索到的分支:
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中,作为global git alias。
~/.gitconfig
clj7thdc6#
此命令查找引入指定路径的提交:
git log --source --all --diff-filter=A --name-only -- '**/my_file.png'
nwo49xxi7#
一个相当不错的Git仓库find命令实现可以在这里找到:https://github.com/mirabilos/git-find
7条答案
按热度按时间fquxozlt1#
git log
+git branch
将为您查找:也支持全局绑定:
单引号是必需的(至少在使用Bash shell时是这样),这样shell就可以将glob模式原封不动地传递给git,而不是将其展开(就像Unix
find
一样)。n9vozmp42#
git ls-tree可能会有所帮助。要搜索所有现有分支:
这样做的好处是,您还可以使用正则表达式搜索文件名。
f5emj3cl3#
尽管ididak's response非常酷,而且 * Handyman 5 * 提供了一个脚本来使用它,但我发现使用这种方法有点受限。
有时候你需要搜索一些会随着时间的推移而出现或消失的东西,那么为什么不搜索所有的提交呢?除此之外,有时候你需要一个冗长的响应,有时候只需要匹配的提交。下面是这些选项的两个版本。把这些脚本放在你的路径中:
git查找文件
git-find-文件详细信息
现在你可以
使用getopt,你可以修改这个脚本来交替搜索所有的提交、引用、引用/头、冗长等等。
检查https://github.com/albfan/git-find-file以获得可能的实现。
xxhby3vn4#
命令行
你可以使用
gitk --all
来搜索提交"接触路径"和你感兴趣的路径名。UI
(归功于:@MikeW的建议。)
a8jjtwal5#
复制并粘贴以使用
git find-file SEARCHPATTERN
打印所有搜索到的分支:
仅打印包含结果的分支:
这些命令会将一些最小的shell脚本直接添加到
~/.gitconfig
中,作为global git alias。clj7thdc6#
此命令查找引入指定路径的提交:
nwo49xxi7#
一个相当不错的Git仓库
find
命令实现可以在这里找到:https://github.com/mirabilos/git-find