我希望能够找到特定 GitHub 项目中提交的次数,并在其中找到特定文件。我查看了 GitHub API 文档,但只发现了一个实际返回所有提交的 API。这将非常低效,因为我需要多次调用 API 来分页浏览所有提交。
有更好的想法吗?
有更好的想法吗?
更新于2013年5月:请参阅 "文件CRUD和存储库统计数据现在可用于API"
现在您可以获取最近一年的提交活动数据
GET /repos/:owner/:repo/stats/commit_activity
原回答(2010年4月)
不,目前的API不支持列出所有分支中的所有提交记录的“log --all
”。
唯一的替代方法在“Github API:检索存储库的所有分支的所有提交记录”中提供,需要按顺序列出所有提交记录的所有页面,一次一个分支。
这个过程看起来很麻烦,另一个选择实际上是克隆 Github 存储库并在本地克隆 应用git命令 !
(主要使用 git shortlog
)
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
。 - Anton0penBrain找到了一种聪明的方法来获取这些信息,并在以下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'
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 >
纯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