如何在 GitHub 上搜索提交消息?

Posted

技术标签:

【中文标题】如何在 GitHub 上搜索提交消息?【英文标题】:How can I search for a commit message on GitHub? 【发布时间】:2013-08-09 23:10:11 【问题描述】:

不是in a Git repository,而是专门在GitHub 中 - 如何仅搜索特定存储库/分支的提交消息?

【问题讨论】:

repo 是公开的还是私有的? 在所有分叉中搜索提交消息怎么样?当主存储库有超过 100 个分叉时,尽量避免重新发明***! 从那以后有什么变化吗? 我想搜索 network 提交 【参考方案1】:

您曾经能够做到这一点,但 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.

【讨论】:

他们为什么要删除它?这是一个非常有用的功能。 神秘因素:I.want.spaces.in.this.string 通常就足够了。 提示在大多数常见用例中省略 -g 标志。我没有对此进行太多研究,但是使用-g,搜索似乎只能追溯到一个月。 git log -g --grep=fix 在回购的 develop 分支中,有大约 8000 次提交跨越两年,只能追溯到 2 月 2 日。 @DanDascalescu 奇怪,我能够找到至少 5 个月前带有 -g 标志的提交。【参考方案2】:

更新(2017 年 1 月 5 日):

GitHub 已发布更新,现在您可以在其 UI 中搜索提交消息。请参阅blog post 了解更多信息。


我有同样的问题,昨天联系了某人 GitHub:

由于他们将搜索引擎切换到 Elasticsearch,因此无法使用 GitHub UI 搜索提交消息。但该功能在团队的愿望清单上。

很遗憾,该功能目前没有发布日期。

【讨论】:

+1 你在 GitHub 上为我节省了徒劳的时间,我想知道如何实现我认为显而易见的功能。所以我们现在必须通过命令行在本地克隆 repo 到 grep。天哪,这就是进步吧?! ;) 即使他们在 Web UI 中的高级搜索也不允许搜索最重要的字段 - 实际的提交消息。这绝对是荒谬的IMO。 Github 齐心协力! 是的。忘记他们已经构建了一个有助于彻底改变和普及开源软件的网络服务这一事实,他们没有这一功能这一事实使它完全是假的! 感谢您花时间在 GitHub 上一个容易找到的公共场所发布您的演讲内容。荒谬的是,这是公众获取此类信息的唯一途径 - GitHub 没有公共问题跟踪器是非常愚蠢的 - 但是在这种愚蠢的情况下,你在这里所做的是防止数百其他人浪费时间发送相同的请求。感谢您节省了数百个工时。 并不比 Atlasian 的公共追踪器好多少,它充满了 7 年的未解决问题和 1000 次投票...【参考方案3】:

截至 2017 年,它是 GitHub itself 中包含的一项功能。

他们使用的示例搜索是repo:torvalds/linux merge:false crypto policy

来自https://github.com/blog/2299-search-commit-messages的GIF图片

【讨论】:

在搜索我拥有读/写权限的私有仓库时出现权限错误。 我已经看了五分钟了,我不知道鼠标在向右缩小后会去哪里。 @KevinKrumwiede 可能是“停止录制”按钮哈哈 我放弃使用“git log --all --grep=searhterm”【参考方案4】:

简短的回答是,您不能直接在 github.com 网站上搜索提交消息。暂时我们推荐该线程其他人提出的本地git grep解决方案。

在某个时间点,GitHub 确实提供了git grep 样式的搜索,以搜索单个存储库的提交消息。不幸的是,这种方法暴露了可能导致文件服务器无法访问的拒绝服务。为此,我们删除了git grep 搜索。

目前的粗略估计显示,GitHub 中的提交数量约为 800 亿大关。尽管 Google 工程师在背后嘲笑我们,但这是要存储在 ElasticSearch 中的大量文档。我们很想使这个数据集可搜索,但这不是一个简单的项目。

【讨论】:

+1。这似乎证实了我写my answer 的想法:提交消息未编入索引:您正在使用索引git diff's(意思是提交的内容,而不是提交元数据) “跳转到提交”按钮怎么样?目前它可以从 URL - ***.com/a/12214817/817632 访问,但它没有接口(我不知道)。用例 - 在 bower.json 中的某处而不是 version 中找到一个提交哈希,并想看看这个提交到底做了什么。这将节省一些时间谷歌搜索。【参考方案5】:

这已从 GitHub 中删除。我用:

$git log --all --oneline | grep "search query"

您也可以按作者过滤:

$git log --all --oneline --author=rickhanlonii | grep "search query"

【讨论】:

这对我有用,但最受好评的答案没有。【参考方案6】:

从searching code 的帮助页面看来,这似乎还不可能。

您可以在存储库中搜索文本,包括选择要搜索的文件或路径的能力,但您不能指定要在提交中搜索。

也许suggest this to them?

【讨论】:

在搜索存储库时,这似乎是更“默认”的用例。特别是对于那些开始了解具有大量提交的新存储库的人。他们绝对应该考虑添加这个。【参考方案7】:

您可以对已被 Google 抓取的存储库执行此操作(结果因存储库而异)。

在所有已爬取的存储库的所有分支中搜索“更改许可证”

“更改许可证”站点:https://github.com/*/*/commits

在所有已爬取的存储库的主分支中搜索“更改许可证”:

“更改许可证”站点:https://github.com/*/*/commits/master

在所有抓取的 twitter 存储库的主分支中搜索“更改许可证”

“更改许可证”站点:https://github.com/twitter/*/commits/master

在 twitter/some_project 存储库的所有分支中搜索“更改许可证”

“更改许可证”站点:https://github.com/twitter/some_project/commits

【讨论】:

@DZenBot 如果它不是公共回购,那么您可能已经有一个本地副本到 git grep,我只是为那些不想克隆整个公共回购的人提供这个答案以弄清楚当做了一些改变。我主要使用它来查找删除对旧 gtk 版本的支持或许可证更改为 gpl3 时的提交【参考方案8】:

Update January 2017(两年后):

您现在可以搜索提交消息! (仍然只在master分支中)


2015 年 2 月:不确定这是否可能,考虑到当前基于 Elasticsearch(引入 in January 2013)的搜索基础架构。

作为“来自可靠和/或官方来源”的答案,这里是 interview done with the GitHub people in charge of introducing Elasticsearch at GitHub(2013 年 8 月)

Tim Pease:我们有两种文档类型:一种是源代码文件,另一种是存储库。 git 的工作方式是你有提交,并且每个提交都有一个分支。存储库文档跟踪已索引的特定存储库的最新提交。当用户将新的提交推送到 Github 时,我们会从 elasticsearch 中提取该存储库文档。然后我们会看到最近索引的提交,然后我们会获得在最近的推送和我们之前索引的内容之间已修改、添加或删除的所有文件的列表。然后我们可以继续更新那些已更改的文档。我们不必在每次有人推送时重新索引整个源代码树。

Andrew Cholakian:所以,我假设你们只索引 master 分支。

蒂姆·皮斯:正确。您只需要进入主分支的负责人,这仍然是大量数据,20 亿个文档,30 TB。

Andrew Cholakian:这是非常巨大的。

[...]

Tim Pease:通过推送源代码索引,这是一个自我修复的过程。 我们有那个存储库文档,它跟踪最后索引的提交。如果我们错过了,只是碰巧错过了这些作业失败的三个提交,下一个提交,我们仍在查看我们索引的上一个提交与我们在这个新推送中看到的那个之间的差异。 您执行git diff 并获得所有已更新、删除或添加的文件。你可以说:“好的,我们需要删除这些文件。我们需要添加这些文件,以及所有这些。”它是自我修复的,这是我们对几乎所有架构都采用的方法。

这一切都意味着不是 所有 回购的分支将使用该方法编制索引。 全局提交消息搜索暂时不可用。 并且Tim Pease himself confirms 提交消息没有被索引

请注意,获取本地克隆的自己的 elasticsearch 本地索引并非不可能:请参阅“Searching a git repository with ElasticSearch”

但是对于特定的 repo,最简单的方法仍然是克隆它并执行以下操作:

git log --all --grep='my search'

(更多选项在“How to search a Git repository by commit message?”)

【讨论】:

【参考方案9】:

由于已从 GitHub 中删除,我一直在 Linux 上使用 gitk 来执行此操作。

从终端转到您的存储库并输入gitk

在 GUI 的中间,有一个搜索框。它提供了很好的过滤器选择:

范围 - 包含、接触路径、添加/删除字符串、更改行匹配

匹配类型 - Exact/IgnCase/Regexp

搜索字段 - 所有字段/标题/评论/提交者

【讨论】:

【参考方案10】:

这在 Eclipse 中运行良好,直到 GitHub 添加该功能:

EGit/User Guide, Searching for commits

【讨论】:

【参考方案11】:

如果您有存储库的本地版本,您可能想尝试我编写的这个粗略的 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 一段时间。)

【讨论】:

【参考方案12】:

截至 2019 年年中

    左上角搜索框中输入您的查询 点击回车 点击“提交”

截图:

【讨论】:

【参考方案13】:

这是快速答案有可能!!

在 github 搜索框(左上角)中像这样简单地搜索:

repo:torvalds/linux merge:false mmap

即:

And here's the results:

阅读更多here

【讨论】:

您的“在这里阅读更多”链接是我在自己的回答***.com/a/28493853/6309中提到的第一个链接 @VonC 谢谢。帮助我的关键信息是 Github 搜索栏的图片和要复制到剪贴板的 repo:torvalds/linux merge:false mmap。其他答案可能很棒,但我花了 2 分钟以上(主要是查看答案的日期),而只需要 5 秒的解决方案【参考方案14】:

结合其他答案,在 Github 上使用高级搜索似乎是最简单的。它基本上是一个搜索字符串生成器。 https://github.com/search/advanced

例如,我想在 Autodesk/maya-usd 中查找所有包含“USD”的提交

然后在搜索结果中可以从左侧列表中选择Commits:

【讨论】:

以上是关于如何在 GitHub 上搜索提交消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过提交消息搜索 Git 存储库?

如何使用正则表达式搜索 Git 提交消息并将这些消息及其行号输出到文本文件

如何使用命令行搜索提交消息? [复制]

如何使用“$ git commit”在消息开头引用问题(gitlab,github)? [复制]

如何使用Github GraphQL搜索我自己的提交?

在 GitHub 上删除带有提交消息的引用?