【发布时间】:2011-11-01 08:28:14
【问题描述】:
使用 Git,我如何在所有本地分支的所有文件中搜索给定字符串?
GitHub 特定:是否可以在所有 GitHub 分支中执行上述搜索? (在我的远程 GitHub 存储库中有几个远程分支,理想情况下我不必为此搜索而关闭......)
【问题讨论】:
-
git-grep 可能是您正在寻找的,但我不确定您需要哪些选项...
使用 Git,我如何在所有本地分支的所有文件中搜索给定字符串?
GitHub 特定:是否可以在所有 GitHub 分支中执行上述搜索? (在我的远程 GitHub 存储库中有几个远程分支,理想情况下我不必为此搜索而关闭......)
【问题讨论】:
您可以在 Git 存储库上执行此操作:
git grep "string/regexp" $(git rev-list --all)
GitHub 高级搜索具有代码搜索能力:
代码搜索将查看 GitHub 上公开托管的所有代码。您还可以通过以下方式过滤:
language:
repo:
path:
【讨论】:
git grep ... 的 git refs 的数量。看看其他答案,即使它被标记为已接受的答案,它们也比这个要好得多!
path:,因为文档一目了然并不清楚在哪里应用此过滤器,我假设它在您的查询示例中的引号之前?
如果你使用@manojlds Git grep 命令并得到错误:
-bash: /usr/bin/git: Argument list too long"
那么你应该使用xargs:
git rev-list --all | xargs git grep "string/regexp"
【讨论】:
git rev-list --all | xargs -J % git grep "string/rexexp" % -- filename。这将在% 出现位置插入的提交块上运行git grep。
在许多情况下,git rev-list --all 可以返回大量提交,需要很长时间才能进行扫描。如果您不想搜索存储库历史中每个分支上的每个提交,而只想搜索所有分支提示,则可以将其替换为 git show-ref -s --heads。所以总的来说:
git grep "string" `git show-ref -s --heads`
或:
git show-ref -s --heads | xargs git grep "string"
提示:您可以将输出写入文件以在编辑器中查看:
nano ~/history.txt
git show-ref -s --heads | xargs git grep "search string here" >> ~/history.txt
【讨论】:
git show-ref --heads 列出哈希和引用名称,因此它(第二行)将搜索两次。所以git show-ref --heads | cut -d' ' -f2 更好,因为它只会列出参考名称。
git show-ref --heads -s 仅输出 SHA1 哈希。此外,如果有多个分支指向同一个提交,您将有重复。您可以使用sort -u 删除它们,例如git show-ref --heads -s | sort -u | xargs git grep ...
function gsearch { git grep $1 $(git show-ref --heads) | grep "refs/heads" | grep $1 } # last grep to keep grep color highlight
此处列出的解决方案存在一些问题(甚至被接受)。
您不需要列出所有哈希值,因为您会得到重复项。此外,这需要更多时间。
它建立在此基础上,您可以在多个分支 master 和 dev 上搜索字符串 "test -f /"
git grep "test -f /" master dev
与
相同printf "master\ndev" | xargs git grep "test -f /"
就这样吧。
这会找到所有本地分支的提示的哈希值并仅在这些提交中搜索:
git branch -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"
如果您也需要在远程分支中搜索,请添加-a:
git branch -a -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"
进一步:
# Search in local branches
git branch | cut -c3- | xargs git grep "string"
# Search in remote branches
git branch -r | cut -c3- | xargs git grep "string"
# Search in all (local and remote) branches
git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string"
# Search in branches, and tags
git show-ref | grep -v "refs/stash" | cut -d' ' -f2 | xargs git grep "string"
【讨论】:
git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string" 否则它将在文件列表中出现-> 符号,表示本地到远程分支的关系
你可以试试这个:
git log -Sxxxx # Search all commits
git log -Sxxxx --branches[=<pattern>] # Search branches
【讨论】:
git log --all -s"search_string"
按照@peter-mortensen & manojlds 的解决方案,我使用git for-each-ref 作为子命令来仅列出具有名称的分支。
git grep "string/regexp" $(git for-each-ref --format='%(refname:short)' refs/heads)
这实现了更好的可视化,只显示命名的分支并且每个分支只生成一个结果。
【讨论】: