14 回答
你曾经能够做到这一点,但 GitHub 在 2013 年年中的某个时候删除了这个功能。要在本地实现这一点,您可以执行以下操作:
git log -g --grep=STRING
(-g
如果您想搜索其他分支和悬空提交,请使用该标志。)
-g, --walk-reflogs
Instead of walking the commit ancestry chain, walk reflog entries from
the most recent one to older ones.
更新(2017/01/05):
GitHub 发布了一个更新,现在您可以在其 UI 中搜索提交消息。有关更多信息,请参阅博客文章。
我有同样的问题,昨天联系了某人 GitHub:
由于他们将搜索引擎切换到 Elasticsearch,因此无法使用 GitHub UI 搜索提交消息。但该功能在团队的愿望清单上。
不幸的是,该功能目前没有发布日期。
截至 2017 年,它是GitHub 本身包含的一项功能。
他们使用的示例搜索是repo:torvalds/linux merge:false crypto policy
来自https://github.com/blog/2299-search-commit-messages的 GIF 图片
简短的回答是,您不能直接在 github.com 网站上搜索提交消息。暂时我们推荐git grep
这个线程上其他人提出的本地解决方案。
在某个时间点,GitHub 确实提供了git grep
针对单个存储库的提交消息的样式搜索。不幸的是,这种方法暴露了可能导致文件服务器无法访问的拒绝服务。出于这个原因,我们删除了git grep
搜索。
目前的粗略估计表明 GitHub 中的提交数量约为 800 亿大关。尽管 Google 工程师在背后嘲笑我们,但这是要存储在 ElasticSearch 中的大量文档。我们很想让这个数据集可搜索,但这不是一个简单的项目。
这已从 GitHub 中删除。我用:
$git log --all --oneline | grep "search query"
您还可以按作者过滤:
$git log --all --oneline --author=rickhanlonii | grep "search query"
您可以对已被 Google 抓取的存储库执行此操作(结果因存储库而异)。
在所有已爬网存储库的所有分支中搜索“更改许可证”
“更改许可证”站点:https ://github.com/*/*/commits
在所有已爬网存储库的主分支中搜索“更改许可证”:
“更改许可证”站点:https ://github.com/*/*/commits/master
在所有已抓取的 Twitter 存储库的主分支中搜索“更改许可证”
在 twitter/some_project 存储库的所有分支中搜索“更改许可证”
2017 年 1 月更新(两年后):
您现在可以搜索提交消息!(仍然只在主分支中)
2015 年 2 月:考虑到当前基于Elasticsearch的搜索基础架构(2013 年 1 月推出) ,不确定这是否可能。
作为“来自可靠和/或官方来源”的答案,这里是对负责在 GitHub 引入 Elasticsearch 的 GitHub 人员进行的采访(2013 年 8 月)
Tim Pease:我们有两种文档类型:一种是源代码文件,另一种是存储库。git 的工作方式是你有提交,并且每个提交都有一个分支。存储库文档跟踪已索引的特定存储库的最新提交。当用户将新的提交推送到 Github 时,我们会从 elasticsearch 中提取该存储库文档。然后,我们会看到最近索引的提交,然后我们会获得在最近的推送与我们之前索引的内容之间已修改、添加或删除的所有文件的列表。然后我们可以继续更新那些已更改的文档。每次有人推送时,我们都不必重新索引整个源代码树。
Andrew Cholakian:所以,你们只索引,我假设,主分支。
蒂姆·皮斯:正确。你要进入的只是主分支的负责人,但仍然有很多数据,20 亿个文档,30 TB。
Andrew Cholakian:这是非常巨大的。
[...]
Tim Pease:通过推送源代码索引,这是一个自我修复的过程。
我们有那个存储库文档,它跟踪最后索引的提交。如果我们错过了,只是碰巧错过了这些作业失败的三个提交,下一个提交,我们仍在查看我们索引的上一个提交与我们在这个新推送中看到的那个之间的差异。
您执行 agit diff
并获得所有已更新、删除或添加的文件。你可以说:“好的,我们需要删除这些文件。我们需要添加这些文件,以及所有这些。” 它是自我修复的,这是我们对几乎所有架构都采用的方法。
这一切都意味着并非所有回购的所有分支都将使用该方法进行索引。
全局提交消息搜索目前不可用。
并且Tim Pease 自己确认 提交消息没有被索引。
请注意,获取本地克隆的自己的 elasticsearch 本地索引并非不可能:请参阅“使用 ElasticSearch 搜索 git 存储库”
但是对于特定的 repo,最简单的方法仍然是克隆它并执行以下操作:
git log --all --grep='my search'
(“如何通过提交消息搜索 Git 存储库? ”中的更多选项)
由于这已从 GitHub 中删除,我一直gitk
在 Linux 上使用它来执行此操作。
从终端转到您的存储库并键入gitk
.
在 GUI 的中间,有一个搜索框。它提供了很好的过滤器选择:
范围 - 包含、接触路径、添加/删除字符串、更改行匹配
匹配类型 - Exact/IgnCase/Regexp
搜索字段 - 所有字段/标题/评论/提交者
这在Eclipse中运行良好,直到 GitHub 添加该功能:
如果您有存储库的本地版本,您可能想尝试我编写的这个粗略的 shell 脚本,以在默认浏览器的新选项卡中打开与您的搜索词匹配的所有提交的 GitHub 页面:
#!/bin/sh
for sha1 in $(git rev-list HEAD -i --grep="$1"); do
python -mwebbrowser https://github.com/RepoOwnerUserName/RepoName/commit/$sha1 >/dev/null 2>/dev/null
done
只需替换https://github.com/RepoOwnerUserName/RepoName/
为您的存储库的实际 GitHub URL,将脚本保存在某处(例如githubsearch.sh
,使其可执行(chmod +x githubsearch.sh
),然后将以下别名添加到您的~/.bashrc
文件中:
alias githubsearch='/path/to/githubsearch.sh'
然后,从您的 Git 存储库中的任何位置,只需在终端执行此操作:
githubsearch "what you want to search for"
并且任何与您的(不区分大小写的)搜索词匹配的提交都将在您的浏览器中打开其相应的 GitHub 页面。(请注意,如果您的搜索词出现在数百次提交中,这很可能会使您的浏览器崩溃并占用您 PC 的 CPU 一段时间。)
结合其他答案,在 Github 上使用高级搜索似乎是最简单的。它基本上是一个搜索字符串生成器。 https://github.com/search/advanced