获取Github单个文件的贡献者

12

我计划为Sphinx文档系统构建一个插件,该插件显示对文档页面做出贡献的人的姓名和Github个人资料链接。

Github在内部拥有此功能。

Contributors

  • 是否可以通过Github API获取文件贡献者的Github个人资料链接?请注意,提交者的电子邮件是不够的,必须能够将它们映射到Github用户资料链接。还请注意,我不想要所有存储库贡献者 - 只想要个别文件贡献者。

  • 如果这不可能,那么您能提出哪些替代方法(私有API、爬取)来从Github提取此信息?

4个回答

18

首先,您可以显示给定文件的提交记录

https://api.github.com/repos/:owner/:repo/commits?path=PATH_TO_FILE

例如:
例如:

https://api.github.com/repos/git/git/commits?path=README

其次,在作者部分,JSON响应中包含一个名为'html_url'的url字段,指向GitHub个人资料页面:
"author": {
      "login": "gitster",
      "id": 54884,
      "avatar_url": "https://0.gravatar.com/avatar/750680c9dcc7d0be3ca83464a0da49d8?d=https%3A%2F%2Fidenticons.github.com%2Ff8e73a1fe6b3a5565851969c2cb234a7.png",
      "gravatar_id": "750680c9dcc7d0be3ca83464a0da49d8",
      "url": "https://api.github.com/users/gitster",   
      "html_url": "https://github.com/gitster",       <==========
      "followers_url": "https://api.github.com/users/gitster/followers",
      "following_url": "https://api.github.com/users/gitster/following{/other_user}",
      "gists_url": "https://api.github.com/users/gitster/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/gitster/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/gitster/subscriptions",
      "organizations_url": "https://api.github.com/users/gitster/orgs",
      "repos_url": "https://api.github.com/users/gitster/repos",
      "events_url": "https://api.github.com/users/gitster/events{/privacy}",
      "received_events_url": "https://api.github.com/users/gitster/received_events",
      "type": "User"
    },

因此,您不需要在此处爬取任何网页。


这是一个非常简陋的jsfiddle示例,用于说明基于JavaScript提取:

var url = "https://api.github.com/repos/git/git/commits?path=" + filename
$.getJSON(url, function(data) {
    var twitterList = $("<ul />");
    $.each(data, function(index, item) {
        if(item.author) {
            $("<li />", {
                "text": item.author.html_url
            }).appendTo(twitterList);
        }
    });

get Contributors from a GiHub file


1
一如既往,阅读你的回答总是令人愉悦的,Von。内容全面且简明扼要。 - Games Brainiac
谢谢。这正是我在寻找的东西。在颁发奖励之前,我会看看是否有替代答案。 - Mikko Ohtamaa
1
好的,结果可以在这里看到:https://github.com/miohtama/sphinxcontrib.contributors/ :) - Mikko Ohtamaa
1
请注意,Github 仅返回最近的 30 次提交记录。如需查看更多,请使用分页功能。 - Alamakanambra

6
使用GraphQL API v4,您可以使用:
{
  repository(owner: "torvalds", name: "linux") {
    object(expression: "master") {
      ... on Commit {
        history(first: 100, path: "MAINTAINERS") {
          nodes {
            author {
              email
              name
              user {
                email
                name
                avatarUrl
                login
                url
              }
            }
          }
        }
      }
    }
  }
}

在浏览器中尝试

使用,获取该文件的前100个贡献者列表(不重复)。
TOKEN=<YOUR_TOKEN>
OWNER=torvalds
REPO=linux
BRANCH=master
FILEPATH=MAINTAINERS
curl -s -H "Authorization: token $TOKEN" \
     -H  "Content-Type:application/json" \
     -d '{ 
          "query": "{repository(owner: \"'"$OWNER"'\", name: \"'"$REPO"'\") {object(expression: \"'"$BRANCH"'\") { ... on Commit { history(first: 100, path: \"'"$FILEPATH"'\") { nodes { author { email name user { email name avatarUrl login url}}}}}}}}"
      }' https://api.github.com/graphql | \
      jq '[.data.repository.object.history.nodes[].author| {name,email}]|unique'

1
有趣的更新,使用更现代的GraphQL。+1 - VonC

1
你为什么需要使用Github API呢?你可以直接克隆包并使用git log命令: git log --format=format:%an path/to/file ver1..ver2 |sort |uniq

请注意,仅提交者的电子邮件地址是不够的,还必须能够将其映射到 Github 用户个人资料链接。 <-- 哪部分难以理解? - Mikko Ohtamaa
添加另一层映射(类似于.mailmap)来将电子邮件映射到GitHub用户并不难。 - plaes
1
@MikkoOhtamaa 你可以在 GitHub 中直接搜索这个电子邮件地址。 - Markus Unterwaditzer
你将如何从Github获取这些信息呢?这就是问题所在 - Mikko Ohtamaa
电子邮件搜索不可用:此API调用仅为兼容性原因而添加。不能保证始终可用完整的电子邮件搜索。地址中的@字符必须保持未编码状态。仅针对公共电子邮件地址进行搜索(如用户GitHub配置文件中配置)。 - Mikko Ohtamaa

0

除非必须直接与GITHUB API交互,否则可以通过克隆存储库并进入克隆目录,然后使用shortlog命令从github日志文件中获取列表来获取贡献者列表。

import os 
import commands 

cmd = "git shortlog -s -n"

os.chdir("C:\Users\DhruvOhri\Documents\COMP 6411\pygithub3-0.3")
os.system("git clone https://github.com/poise/python.git")
os.chdir("/home/d/d_ohri/Desktop/python")
output = commands.getoutput(cmd) 
print(output)
raw_input("press enter to continue")

如果想要使用GITHUB API列出贡献者,还有一种方法,我们可以使用pytgithub3包装器与GITHUB API进行交互,并使用list_contributors获取贡献者列表,如下所示:

from pytgithub3.services.repo import Repo
r = Repo()
r.lis_contributors(user='userid/author',repo='repo name')
for page in r:
    for result in page:
          print result

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接