我想查找对特定 github 项目以及在其中对特定文件的提交次数。我检查了github api 文档,但只找到了一个用于实际返回所有提交的 API。这将是非常低效的,因为我必须通过所有提交进行多次 api 调用以进行分页。
有人有更好的主意吗?
我想查找对特定 github 项目以及在其中对特定文件的提交次数。我检查了github api 文档,但只找到了一个用于实际返回所有提交的 API。这将是非常低效的,因为我必须通过所有提交进行多次 api 调用以进行分页。
有人有更好的主意吗?
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 脚本。
使用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
}
}
}
}
}
}
}
}
纯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