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

问题描述 投票:0回答:2

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

用户通过连接到其 github 帐户(通过 Web 应用程序流程)授权访问后,我希望能够以编程方式使用 REST API 从存储库文件中检索一行块。

在 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/{用户名}/{存储库名称}/contents/{文件路径}

例如以下代码可以工作:

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,如下所示,它不会改变任何东西。我希望它能够更改 download_url,以便它只包含第 3 行到第 7 行:

https://api.github.com/repos/getsentry/sentry-ruby/contents/sentry-rails/app/jobs/sentry/send_event_job.rb#L3-L7
我在 Github 文档上找不到调用哪个 url 来使用 REST API 以编程方式检索这种类型的

多行代码片段

注意:我知道如何获取整个“download_url”:

https://raw.githubusercontent.com/getsentry/sentry-ruby/master/sentry-rails/app/jobs/sentry/send_event_job.rb

文件,然后解析它以仅将第X行保留到第Y行,但我想知道是否有直接的API命令来执行您可以轻松执行的操作用户界面。

谢谢

github github-api
2个回答
4
投票
GitHub 的 REST API 不提供仅提取文件几行的方法。在 Web 界面中,您可以获得整个渲染文件,其中仅突出显示几行,而不仅仅是一个片段。

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

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

请注意,您的

#L3-L7

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


0
投票
2024 年 4 月,仍然没有单独使用 GitHub API 检索代码片段的直接方法。所以,@bk2204给出的

答案是正确的。然而,有一些解决方法可以实现这一目标。下面,我概述了使用 curl

sed
 的方法,以及如何从 GitHub 的 API 或 GitHub HTML 链接获取必要的 
download_url

使用

curl
sed
 检索代码片段

给定直接的

download_url,您可以使用 curl

 获取文件,并使用 
sed
 提取特定行或代码块。例如,要从 
README.md
 存储库的 
openjdk
 检索第一行:

curl -sL "https://raw.githubusercontent.com/openjdk/jdk/614db2ea9e10346475eef34629eab54878aa482d/README.md" | sed -n '1p'
执行此命令将输出 

README.md

 文件的第一行:

# Welcome to the JDK!
获取

download_url

获取下载网址主要有两种方法:

通过 GitHub API: 可以从 GitHub API 的响应中获取 download_url

。有关详细信息,请参阅 
GitHub 有关存储库内容的 API 文档

来自 GitHub HTML 链接:如果您有 GitHub HTML 链接,您可以以编程方式将其转换为某种 download_url

。首先,将 
github.com
 替换为 
raw.githubusercontent.com
,然后从原始链接中删除 
blob
。换句话说,您可以转换此链接:

https://github.com/openjdk/jdk/blob/614db2ea9e10346475eef34629eab54878aa482d/README.md?plain=1#L1-L2
对于这个:

https://raw.githubusercontent.com/openjdk/jdk/614db2ea9e10346475eef34629eab54878aa482d/README.md?plain=1#L1-L2
以下是如何在 Ruby 中做到这一点:

def download_url_link(html_link) html_link.gsub('https://github.com', 'https://raw.githubusercontent.com').gsub('blob/', '') end
虽然这种方法可能不稳定,但它对于我的一些任务来说效果很好,没有任何问题。更重要的是,在这种情况下,您可以完全避免使用 GitHub API。

© www.soinside.com 2019 - 2024. All rights reserved.