问题
Using the GitHub API (v3) I'd like to figure out which branches a commit appears on. I didn't find a way to directly query this, either through repo commits or the commit data objects. An alternate solution would be to list all the branches, and compare with their HEAD; I guess the comparison would fail if the commit is not on the given branch.
Is this supported via the current API, and I just missed it? If not, do you have a (better) workaround?
回答1:
That's not possible directly via the GitHub API.
Workaround 1:
- get a list of all branches
- for each branch, get a list of commits on that branch
- check if the commit is in the list of commits for each branch
Workaround 2 (I think this will work, but not 100% sure if I missed a case):
- get a list of all branches
for each branch, compare the branch with the SHA:
https://api.github.com/repos/:user/:repo/compare/:branch...:sha_of_commit
If the value of the
status
attribute in the response isdiverged
orahead
, then the commit is not in the branch. If the value of thestatus
attribute isbehind
oridentical
, then the commit is in the branch.
回答2:
I haven't checked if this is directly supported by the GitHub API, but this is trivial to do using plain Git:
git branch --all --contains <commit>
That will list all branches (local and remote) in a local repository that contain the given commit.
回答3:
GitLab API
Following Ivan Zuzak's solution number 2, to know if a commit is on a branch:
Use GitLab's repository compare API, and compare from the branch, to the commit
GET /projects/:id/repository/compare?from=<branch>&to=<sha_of_commit>
If the commits
list is empty, then yes, the commit is on that branch.
In Python, using python-gitlab:
def is_commit_on_branch(project, commit, branch):
c = project.repository_compare(branch, commit)
return not c['commits']
来源:https://stackoverflow.com/questions/23899329/list-of-branches-a-commit-appears-on