获取已对特定文件进行提交的贡献者列表

时间:2017-10-16 02:33:37

标签: github-api

  

我正在寻找获取提交的作者/贡献者的方法。我是github-api的新手,this让我比我想象的更麻烦。

我们开始......

  • 我有list of contributors
  • 我可以通过github网站上的撰稿人过滤提交内容?author=,如this
  • 也可以在文件提交中看到贡献者 Github displays contributor of a file

应该可以

  • 所有这些让我觉得应该可以通过API找到文件的贡献者。
  

问题描述

     

如果我有文件such as this的URL,是否有一个github API向我显示已提交该文件的贡献者列表?

     

或者,我是否需要使用多个API调用的结果,例如(例如)

           

I'm thinking of cross-referencing the outputs of those two^ if everything else fails.

示例输出

This应该返回Pratik855

*编辑

我发现了这个SO answer,但这并不是我想要的。虽然提出了所有要求,但我不确定https://api.github.com/repos/csitauthority/csitauthority.github.io/commits?=README如何根据https://api.github.com/repos/csitauthority/csitauthority.github.io/commits?=HUGO/content/page/vlan-101.md转换为https://github.com/csitauthority/CSITauthority.github.io/blob/master/HUGO/content/post/vlan-101.md,因为HUGO只能生成第三种规范网址。

我正在使用

  • 雨果
  • Github页面

1 个答案:

答案 0 :(得分:2)

您可以通过使用文件的repo路径调用List commits on a repository端点作为path参数的值来获取存储库中特定文件的所有贡献者的完整数据:

https://api.github.com/repos/csitauthority/CSITauthority.github.io/commits?path=HUGO/content/post/vlan-101.md

即,一般形式是:

GET /repos/:owner/:repo/commits?path=:path-to-file

这将返回一个JSON对象,其中包含该文件的所有提交数组。要从每个中获取贡献者名称,您可以选择使用commit.author.namecommit.committer.name(取决于您实际需要的那些)或author.logincommitter.login

所以这是一个单独的API调用,但只需要获取名称,您需要处理您获得的JSON数据。

以下是在JavaScript中执行此操作的简单示例:



const githubAPI = "https://api.github.com"
const commitsEndpoint = "/repos/csitauthority/CSITauthority.github.io/commits"
const commitsURL = githubAPI + commitsEndpoint
const filepath = "HUGO/content/post/vlan-101.md"
fetch(commitsURL + "?path=" + filepath)
  .then(response => response.json())
  .then(commits => {
    for (var i = 0; i < commits.length; i++) {
      console.log(commits[i].commit.author.name)
    }
  })
&#13;
&#13;
&#13;

这是一个如何跳过任何重复名称并以一组唯一名称结尾的示例:

&#13;
&#13;
const githubAPI = "https://api.github.com"
const commitsEndpoint = "/repos/csitauthority/CSITauthority.github.io/commits"
const commitsURL = githubAPI + commitsEndpoint
const filepath = "HUGO/content/post/grandfather-problem.md"
fetch(commitsURL + "?path=" + filepath)
  .then(response => response.json())
  .then(commits => {
    const names = [];
    for (var i = 0; i < commits.length; i++) {
      if (!names.includes(commits[i].commit.author.name)) {
        names.push(commits[i].commit.author.name);
      }
    }
    console.log(names.join("\n"));
  })
&#13;
&#13;
&#13;