Github REST API - 如何检索特定的代码行(代码片段)

时间:2021-03-10 08:48:24

标签: github github-api

我想通过 REST API 检索特定的代码行。

在用户通过连接到他的 github 帐户(通过 Web Application flow)授权访问后,我希望能够以编程方式使用 REST API 从存储库文件中检索一行代码< /strong>。

在 github.com UI 上,很容易只获取某些行:您可以选择多行并获取“永久链接”,例如第 3 行到第 7 行:

https://github.com/{username}/{repo_name}/blob/{specific file ex: ce3f225c2025556705353f8369097e760d063c6bbce3}/{file_path_in_the_repo}#L3-L7

在 API 上,我没能做到。我设法获得了代码,但仅限于整个文件,不限于某些行: https://api.github.com/repos/{username}/{repository_name}/contents/{file_path}

例如以下代码有效:

https://api.github.com/repos/getsentry/sentry-ruby/contents/sentry-rails/app/jobs/sentry/send_event_job.rb

结果是

{
  "name": "send_event_job.rb",
  "path": "sentry-rails/app/jobs/sentry/send_event_job.rb",
  "sha": "55314dd99703fc121516513a59e20377b2534f48",
  "size": 980,
  "url": "https://api.github.com/repos/getsentry/sentry-ruby/contents/sentry-rails/app/jobs/sentry/send_event_job.rb?ref=master",
  "html_url": "https://github.com/getsentry/sentry-ruby/blob/master/sentry-rails/app/jobs/sentry/send_event_job.rb",
  "git_url": "https://api.github.com/repos/getsentry/sentry-ruby/git/blobs/55314dd99703fc121516513a59e20377b2534f48",
  "download_url": "https://raw.githubusercontent.com/getsentry/sentry-ruby/master/sentry-rails/app/jobs/sentry/send_event_job.rb",
  "type": "file",
  "content": "aWYgZGVmaW5lZD8oQWN0aXZlSm9iKQogIG1vZHVsZSBTZW50cnkKICAgIHBh\ncmVudF9qb2IgPQogICAgICBpZiBkZWZpbmVkPyg6OkFwcGxpY2F0aW9uSm9i\nKSAmJiA6OkFwcGxpY2F0aW9uSm9iLmFuY2VzdG9ycy5pbmNsdWRlPyg6OkFj\ndGl2ZUpvYjo6QmFzZSkKICAgICAgICA6OkFwcGxpY2F0aW9uSm9iCiAgICAg\nIGVsc2UKICAgICAgICA6OkFjdGl2ZUpvYjo6QmFzZQogICAgICBlbmQKCiAg\nICBjbGFzcyBTZW5kRXZlbnRKb2IgPCBwYXJlbnRfam9iCiAgICAgICMgdGhl\nIGV2ZW50IGFyZ3VtZW50IGlzIHVzdWFsbHkgbGFyZ2UgYW5kIGNyZWF0ZXMg\nbm9pc2UKICAgICAgc2VsZi5sb2dfYXJndW1lbnRzID0gZmFsc2UgaWYgcmVz\ncG9uZF90bz8oOmxvZ19hcmd1bWVudHM9KQoKICAgICAgIyB0aGlzIHdpbGwg\ncHJldmVudCBpbmZpbml0ZSBsb29wIHdoZW4gdGhlcmUncyBhbiBpc3N1ZSBk\nZXNlcmlhbGl6aW5nIFNlbnRyeUpvYgogICAgICBpZiByZXNwb25kX3RvPyg6\nZGlzY2FyZF9vbikKICAgICAgICBkaXNjYXJkX29uIEFjdGl2ZUpvYjo6RGVz\nZXJpYWxpemF0aW9uRXJyb3IKICAgICAgZWxzZQogICAgICAgICMgbWltaWMg\nd2hhdCBkaXNjYXJkX29uIGRvZXMgZm9yIFJhaWxzIDUuMAogICAgICAgIHJl\nc2N1ZV9mcm9tIEFjdGl2ZUpvYjo6RGVzZXJpYWxpemF0aW9uRXJyb3IgZG8K\nICAgICAgICAgIGxvZ2dlci5lcnJvciAiRGlzY2FyZGVkICN7c2VsZi5jbGFz\nc30gZHVlIHRvIGEgI3tleGNlcHRpb259LiBUaGUgb3JpZ2luYWwgZXhjZXB0\naW9uIHdhcyAje2Vycm9yLmNhdXNlLmluc3BlY3R9LiIKICAgICAgICBlbmQK\nICAgICAgZW5kCgogICAgICBkZWYgcGVyZm9ybShldmVudCwgaGludCA9IHt9\nKQogICAgICAgIFNlbnRyeS5zZW5kX2V2ZW50KGV2ZW50LCBoaW50KQogICAg\nICBlbmQKICAgIGVuZAogIGVuZAplbHNlCiAgbW9kdWxlIFNlbnRyeQogICAg\nY2xhc3MgU2VuZEV2ZW50Sm9iOyBlbmQKICBlbmQKZW5kCgo=\n",
  "encoding": "base64",
  "_links": {
    "self": "https://api.github.com/repos/getsentry/sentry-ruby/contents/sentry-rails/app/jobs/sentry/send_event_job.rb?ref=master",
    "git": "https://api.github.com/repos/getsentry/sentry-ruby/git/blobs/55314dd99703fc121516513a59e20377b2534f48",
    "html": "https://github.com/getsentry/sentry-ruby/blob/master/sentry-rails/app/jobs/sentry/send_event_job.rb"
  }
}

但是如果我添加 L3-L7,如下所示,它不会改变任何东西。我会改变它,例如下载_url,以便它只包含第 3 行到第 7 行:

https://api.github.com/repos/getsentry/sentry-ruby/contents/sentry-rails/app/jobs/sentry/send_event_job.rb#L3-L7

我在 Github Docs 上没有找到使用 REST API 调用以编程方式检索这种类型的多行代码片段的网址?

注意:我知道如何获取整个“download_url”:https://raw.githubusercontent.com/getsentry/sentry-ruby/master/sentry-rails/app/jobs/sentry/send_event_job.rb 文件,然后将其解析为仅将 X 行保留到 Y 行,但我想知道是否有直接的 API 命令来执行您的操作可以通过 UI 轻松完成。

谢谢

1 个答案:

答案 0 :(得分:1)

GitHub 的 REST API 不提供仅提取文件几行的方法。在 Web 界面中,您可以获得整个渲染文件,其中仅突出显示了几行,而不仅仅是片段。

之所以出现这种情况,是因为从文件中提取有限数量的行实际上比提取整个文件要多得多。所有文件都存储为 Git blob,并且无法从 blob 中仅提取某些行而不读取整个文件,因为 blob 是压缩存储的。因此,GitHub 实际上会花费更多的精力将整个文件读入内存,然后将其限制为您想要的行,结果,这样的 API 将受到更多限制,无法处理几乎一样大。

此外,在某些情况下,对于什么构成一条线没有合理的答案。虽然 Git 通常希望文件以 LF 结尾存储,但如果文件已以 CRLF 结尾签入,是否应该处理这些文件? (如果是这样,那就是正确处理它们的额外工作。)如果您有一个二进制文件,如 JPEG,则没有行。同样,虽然 UTF-16 中的文件可能有行,但 Git 将它们视为二进制文件,因此它们可能无法处理。

请注意,您的 #L3-L7 不能作为 API 的一部分工作的原因,除了 API 不支持它之外,是因为这是一个片段,通常不会发送到服务器。它应该识别文档的特定部分,这通常在客户端的 Web 浏览器中完成。由于您的 API 请求没有客户端执行此操作,因此服务器甚至看不到您的请求。