教程:使用GO进行内存中Git克隆、提交和推送

2020-10-28 07:16:32

今天的文章是关于如何设置和使用Go-Git库来克隆和更新具有内存文件系统的存储库的教程。如果您希望推送或克隆存储库,而不接触操作系统文件系统并处理权限或临时文件,则此过程非常有用。尽管有关于Git-Go的文档,但我发现由于库的版本和名称不同,所以不是很清楚,有时还会产生误导。基于这个原因,我决定分享这篇教程,希望能对某些人有所帮助。出于本教程的目的,我们将在main.go文件中执行所有操作,但是您可能希望针对您的用例使用更柔和的文件:)。

一个https Git存储库(Github、Bitbucket其实并不重要,只要它可以通过https访问即可。)。

要设置内存中的文件系统,我们将使用两个包storage和memf。存储程序将包含对象、引用和其他元数据(通常与目录.git相同)。Memfs文件系统将成为我们的文件系统,用于读取、创建和删除存储库中的任何类型的文件。第一步,我们需要创建两个对象(存储器和文件系统)。

软件包mainimport(";fmt";billy";github.com/go-git/go-billy/v5";memfs";github.com/go-git/go-billy/v5/memfs";git";github.com/go-git/go-git/v5";http";github.com/go-git/go-git/v5/plumbing/transport/http";Memory";Github.com/go-git/go-git/v5/storage/memory";)var存储器*Memory.Storagevar fs billy.Filesystemfunc Main(){STORLER=Memory.NewStorage()fs=memfs.New()...。

第二步,为了将我们的存储库放在内存文件系统中,我们需要克隆它并创建工作树对象。函数Clone()还将返回Repository接口,然后我们将使用该接口将()推送到远程。方法Worktree()将返回我们需要添加()&;Commit()更改的Worktree对象。最后,如果我们的存储库是私有的,我们将需要设置基本身份验证来克隆它(无论如何我们都需要基本身份验证来推送,所以最好在这里设置它!)。

...//身份验证身份验证:=&;http.BasicAuth{用户名:";您的-git-用户,密码:";您的-git-pass";,}存储库:=";https://github.com/your-org/your-repo";r,err:=git.Clone(存储器,文件,&;git.CloneOptions{url:存储库,身份验证:身份验证,})如果err!=空{fmt.Printf(";%v";,err)return}fmt.Println(";存储库克隆";)w,err:=r.Worktree()if err!=nil{fmt.Printf(";%v";,err)return}。

现在,我们将使用fs对象创建一个实际的文件,并将其添加&;提交到Worktree()。

由于某种原因(我不知道),如果文件名以“/”开头,它将创建一个文件夹,而不是一个文件。例如:/hello/world.txt(world.txt将是一个目录)hello/world.txt(world.txt将是hello文件夹内的文件)

...//新建文件filePath:=";my-new-ifiFi.txt";newFile,err:=fs.Create(FilePath)if err!=nil{return}newFile.Write([]byte(";my new file";)newFile.Close()//在将文件添加到工作树fmt.Println(w.Status())//git add$filePath w.Add(FilePath)//在文件添加到工作树之后运行git状态fmt.Println(w.Status())//git Commit-m$message w.Commit(";Added My New File";,&;git.Committee Options{})。

Push()将使用Repository接口的方法执行,如下所示。

...//如果err!=nil{return}fmt.Println(";远程更新.";,filePath)return},则将代码推送到远程err=r.Push(&;git.PushOptions{RemoteName:";Origin";,Auth:Auth,})。

Go mod initgo buildgo run main.go Repository Clone??My-new-file.txt<;nil>;A my-new-file.txt<;nil>;远程更新。My-new-file.txt。

我知道这是一个相当具体的主题,但我希望这篇教程能对某些人有所帮助!

再见!这是ISH(~),这是我的博客。一堆文章、帖子和考虑大多来自我目前正在关注的项目。我很乐意阅读您的意见或回答您可能有的问题,所以请随时在Twitter上联系!:d