赞
踩
import (
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
githttp "github.com/go-git/go-git/v5/plumbing/transport/http"
)
if gitAccessToken == "" { // 用用户名和密码拉取 gitAuthName = gitUserName gitAuthPass = gitUserPass } else { // 用AccessToken拉取 gitAuthName = "noemptystr" gitAuthPass = gitAccessToken } var branch string auth := &githttp.BasicAuth{ Username: gitAuthName, Password: gitAuthPass, } _, err := git.PlainClone(git_path, false, &git.CloneOptions{ URL: gitUrl, Auth: auth, Progress: os.Stdout, ReferenceName: plumbing.NewBranchReferenceName(branch), SingleBranch: true, })
可以单独拉取指定分支
if gitBranch != "" { _, err := git.PlainClone(gitPath, false, &git.CloneOptions{ //gitPath为本地克隆目标位置 URL: gitUrl, Auth: auth, Progress: os.Stdout, ReferenceName: plumbing.NewBranchReferenceName(branch), SingleBranch: true, //只拉取一个分支 }) if err != nil { fmt.Println("克隆失败:", err) } else { fmt.Println("克隆成功") } }
只能先拉取完整仓库,再找到最后一次提交分支的信息,最后切换到该分支
func cloneHEAD(auth *githttp.BasicAuth, gitUrl string, git_path string) { remoteRepo, err := git.PlainClone(git_path, false, &git.CloneOptions{ URL: gitUrl, Auth: auth, Progress: os.Stdout, }) //拉取完整仓库 if err != nil { fmt.Println("克隆失败:", err) return } // 获取远程仓库的引用 remote, err := remoteRepo.Remote("origin") if err != nil { fmt.Println("获取远程仓库的引用失败", err) return } // 获取远程分支的引用列表 refs, err := remote.List(&git.ListOptions{Auth: auth}) if err != nil { fmt.Println("获取远程分支的引用列表失败", err) return } // 记录最新更新的分支信息 var lastCommitTime time.Time var lastCommitBranch string var lastRef *plumbing.Reference // 打印远程分支名称 for _, ref := range refs { commit, err := remoteRepo.CommitObject(ref.Hash()) //log.Printf("遍历分支最晚提交,分支:%s,hash%s,时间%v\n", ref.String(), ref.Hash(), commit.Committer.When) if err != nil { if err == plumbing.ErrObjectNotFound { fmt.Printf("%s分支未获取commit:%v\n", ref.String(), err) continue // 这里可以执行相关处理逻辑 } else { fmt.Printf("获取commit失败:%v\n", err) continue } } else { fmt.Printf("%s分支已获取commit\n", ref.String()) } // 比较提交时间,更新最新的分支信息 if commit.Committer.When.After(lastCommitTime) { lastCommitTime = commit.Committer.When lastCommitBranch = ref.Name().Short() lastRef = ref } } fmt.Println("获取到最后提交分支,", lastCommitBranch) // 切换到给定引用所在的分支 wt, err := remoteRepo.Worktree() if err != nil { log.Fatal(err) } if err := wt.Checkout(&git.CheckoutOptions{ Hash: lastRef.Hash(), }); err != nil { fmt.Println("切换分支失败:%v\n", err) } fmt.Println("切换分支成功:", lastCommitBranch) }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。