GitHub API:如何高效地查找存储库的提交数量?

18
我希望能够找到特定 GitHub 项目中提交的次数,并在其中找到特定文件。我查看了 GitHub API 文档,但只发现了一个实际返回所有提交的 API。这将非常低效,因为我需要多次调用 API 来分页浏览所有提交。
有更好的想法吗?

@drorw 你好,请问你是如何集成访问令牌的? - user6456773
4个回答

13

更新于2013年5月:请参阅 "文件CRUD和存储库统计数据现在可用于API"

现在您可以获取最近一年的提交活动数据

GET /repos/:owner/:repo/stats/commit_activity

返回按周分组的最近一年提交活动。days数组是每天的提交组,从星期日开始。
并不完全符合您的要求,但更接近了。

原回答(2010年4月)

不,目前的API不支持列出所有分支中的所有提交记录的“log --all”。

唯一的替代方法在“Github API:检索存储库的所有分支的所有提交记录”中提供,需要按顺序列出所有提交记录的所有页面,一次一个分支。

这个过程看起来很麻烦,另一个选择实际上是克隆 Github 存储库并在本地克隆 应用git命令
(主要使用 git shortlog)


注意:你也可以检查由Arcsector创建的python script

2
如果您对API有具体的建议或功能请求,请发送电子邮件至GitHub支持团队并告诉他们:https://github.com/contact - Ivan Zuzak
你知道是否有可能获得超过一年的时间吗? - grepsedawk
@Pachonk 不会:我猜GitHub的支持团队会知道。 - VonC

5
使用GraphQL API v4,您可以使用totalCount获取每个分支的总提交次数:
{
  repository(owner: "google", name: "gson") {
    name
    refs(first: 100, refPrefix: "refs/heads/") {
      edges {
        node {
          name
          target {
            ... on Commit {
              id
              history(first: 0) {
                totalCount
              }
            }
          }
        }
      }
    }
  }
}

在浏览器中测试它


如果您只想获取默认分支的提交次数,可以使用类似的方法,但是使用 defaultBranchRef 属性而不是 refs - Anton

1

0penBrain找到了一种聪明的方法来获取这些信息,并在以下Gist中详细说明:https://gist.github.com/0penBrain/7be59a48aba778c955d992aa69e524c5

以下是相关的代码片段,使用curl

curl -I -k "https://api.github.com/repos/:owner/:repo/commits?per_page=1" | sed -n '/^[Ll]ink:/ s/.*"next".*page=\([0-9]*\).*"last".*/\1/p'

关键是启用每页1个提交的分页,可以在查询字符串中看到。 然后重点必须从响应JSON主体转移到HTTP标头,可以在以下条目中找到:
link: <https://api.github.com/repositories/27193779/commits?per_page=1&page=2>; rel="next", <https://api.github.com/repositories/27193779/commits?per_page=1&page=37949>; rel="last"
< p > 然后 sed 表达式负责提取 37949 数字(在此示例中)< /p >

0

纯JS实现

const base_url = 'https://api.github.com';

    function httpGet(theUrl, return_headers) {
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.open("GET", theUrl, false); // false for synchronous request
        xmlHttp.send(null);
        if (return_headers) {
            return xmlHttp
        }
        return xmlHttp.responseText;
    }

    function get_all_commits_count(owner, repo, sha) {
        let first_commit = get_first_commit(owner, repo);
        let compare_url = base_url + '/repos/' + owner + '/' + repo + '/compare/' + first_commit + '...' + sha;
        let commit_req = httpGet(compare_url);
        let commit_count = JSON.parse(commit_req)['total_commits'] + 1;
        console.log('Commit Count: ', commit_count);
        return commit_count
    }

    function get_first_commit(owner, repo) {
        let url = base_url + '/repos/' + owner + '/' + repo + '/commits';
        let req = httpGet(url, true);
        let first_commit_hash = '';
        if (req.getResponseHeader('Link')) {
            let page_url = req.getResponseHeader('Link').split(',')[1].split(';')[0].split('<')[1].split('>')[0];
            let req_last_commit = httpGet(page_url);
            let first_commit = JSON.parse(req_last_commit);
            first_commit_hash = first_commit[first_commit.length - 1]['sha']
        } else {
            let first_commit = JSON.parse(req.responseText);
            first_commit_hash = first_commit[first_commit.length - 1]['sha'];
        }
        return first_commit_hash;
    }

    let owner = 'getredash';
    let repo = 'redash';
    let sha = 'master';
    get_all_commits_count(owner, repo, sha);

致谢 - https://gist.github.com/yershalom/a7c08f9441d1aadb13777bce4c7cdc3b


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