如何使用go-github客户端查询包含指定git sha的远程分支
基于go-github通过Git SHA查询包含该提交的远程分支实现方法
首先明确:可以通过go-github实现该需求,GitHub官方提供了对应的底层API,go-github已经做了完整封装。
核心实现逻辑
- 第一步:调用
github.Repositories.ListBranches方法拉取目标仓库的全部分支信息,注意处理分页参数,单次请求最多返回100条分支 - 第二步:对拉取到的每一个分支,调用
github.Repositories.CompareCommits方法,入参分别为仓库所属用户名、仓库名、待查询的Git SHA、分支名 - 第三步:校验接口返回的
Comparison.Status字段,如果返回值为behind或者identical,说明待查询的SHA属于该分支:identical代表待查询SHA和分支HEAD完全一致behind代表分支的提交历史包含待查询SHA,当前分支HEAD是该SHA之后的提交
示例代码
package main import ( "context" "fmt" "github.com/google/go-github/v55/github" "golang.org/x/oauth2" ) func ListBranchesContainsSha(ctx context.Context, owner, repo, targetSha string, client *github.Client) ([]string, error) { var res []string opt := &github.ListOptions{PerPage: 100} // 拉取全部分支 for { branches, resp, err := client.Repositories.ListBranches(ctx, owner, repo, opt) if err != nil { return nil, err } // 逐个校验分支是否包含目标SHA for _, b := range branches { cmp, _, err := client.Repositories.CompareCommits(ctx, owner, repo, targetSha, b.GetName(), nil) if err != nil { return nil, err } if cmp.GetStatus() == "behind" || cmp.GetStatus() == "identical" { res = append(res, b.GetName()) } } if resp.NextPage == 0 { break } opt.Page = resp.NextPage } return res, nil } func main() { ctx := context.Background() // 替换为你的GitHub Token ts := oauth2.StaticTokenSource( &oauth2.Token{AccessToken: "your-github-token"}, ) tc := oauth2.NewClient(ctx, ts) client := github.NewClient(tc) // 测试查询 branches, err := ListBranchesContainsSha(ctx, "google", "go-github", "填写你要查询的SHA", client) if err != nil { panic(err) } fmt.Println("包含目标SHA的分支:", branches) }
性能优化建议
- 如果仓库分支量级很大,可以先拉取所有分支的HEAD提交时间,过滤掉HEAD提交时间早于目标SHA提交时间的分支,不需要再调用比较接口,能大幅降低API请求次数
- 可以对CompareCommits的请求做并发处理,注意不要超过GitHub API的速率限制,个人认证用户每小时最多请求5000次,未认证用户每小时仅60次
内容的提问来源于stack exchange,提问作者shakalaka
相关产品推荐
相关产品推荐

