【go】克隆git仓库到最后一次提交的分支、用AccessToken拉取,2024年最新Flutter最新开源框架

34 阅读2分钟
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"
)

用密码或者AccesToken克隆


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


![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a74bd3acdd6d4634b7f0c57d341adb59~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771250827&x-signature=PBJmBZex%2Bst4R9CjnUaVtU2dwVE%3D)
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/02722bdd59884f70912dd0bff479c21b~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771250827&x-signature=KxsHKJjg7u6z9GjFEkx9NmPs0Tk%3D)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://gitee.com/vip204888)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**