16

我想查找对特定 github 项目以及在其中对特定文件的提交次数。我检查了github api 文档,但只找到了一个用于实际返回所有提交的 API。这将是非常低效的,因为我必须通过所有提交进行多次 api 调用以进行分页。

有人有更好的主意吗?

4

3 回答 3

12

2013 年 5 月更新:请参阅“ API 中现在提供文件 CRUD 和存储库统计信息

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

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

返回按周分组的最后一年的提交活动。days 数组是每天的一组提交,从星期日开始。

完全是您正在寻找的东西,但更接近。


原始答案(2010 年 4 月)

不,当前的 API 不支持 ' log --all' 用于列出来自所有分支的所有提交。

唯一的替代方法在“ Github API:检索所有分支的所有提交以进行 repo ”中,并列出所有提交的所有页面,一个分支一个分支

这似乎比另一种替代方法实际克隆Github 存储库并在该本地克隆上应用 git 命令更麻烦!
(主要git shortlog


注意:您还可以签出由Arcsector创建的python 脚本

于 2013-04-10T07:36:30.597 回答
4

使用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
              }
            }
          }
        }
      }
    }
  }
}

在资源管理器中测试它

于 2017-11-27T00:19:21.170 回答
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

于 2020-05-01T18:12:11.177 回答