80 lines
1.7 KiB
Go
80 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
|
|
"github.com/go-git/go-git/v5/plumbing/transport/http"
|
|
|
|
"github.com/go-git/go-git/v5"
|
|
. "github.com/go-git/go-git/v5/_examples"
|
|
"github.com/go-git/go-git/v5/plumbing"
|
|
"github.com/go-git/go-git/v5/plumbing/object"
|
|
)
|
|
|
|
func main() {
|
|
CheckArgs("<url>", "<github_username>", "<github_password>")
|
|
url, username, password := os.Args[1], os.Args[2], os.Args[3]
|
|
|
|
directory := "./local-repo"
|
|
|
|
// 克隆裸仓库到本地
|
|
Info("git clone %s %s", url, directory)
|
|
|
|
_, err := git.PlainClone(directory, false, &git.CloneOptions{
|
|
Auth: &http.BasicAuth{
|
|
Username: username,
|
|
Password: password,
|
|
},
|
|
URL: url,
|
|
Progress: os.Stdout,
|
|
})
|
|
CheckIfError(err)
|
|
|
|
// 打开本地仓库
|
|
r, err := git.PlainOpen(directory)
|
|
CheckIfError(err)
|
|
|
|
// 获取 HEAD 引用
|
|
ref, err := r.Reference(plumbing.HEAD, true)
|
|
CheckIfError(err)
|
|
|
|
// 解析 HEAD 引用到提交对象
|
|
commit, err := r.CommitObject(ref.Hash())
|
|
CheckIfError(err)
|
|
|
|
// 获取提交对象的树对象
|
|
tree, err := commit.Tree()
|
|
CheckIfError(err)
|
|
|
|
// 遍历树对象中的文件
|
|
tree.Files().ForEach(func(f *object.File) error {
|
|
fmt.Printf("Found file: %s\n", f.Name)
|
|
|
|
// 获取 blob 对象
|
|
blob, err := r.BlobObject(f.Blob.Hash)
|
|
CheckIfError(err)
|
|
|
|
// 获取 blob 的内容
|
|
blobReader, err := blob.Reader()
|
|
CheckIfError(err)
|
|
|
|
defer blobReader.Close()
|
|
|
|
// 读取 blob 的内容
|
|
fileContent, err := ioutil.ReadAll(blobReader)
|
|
CheckIfError(err)
|
|
|
|
// 打印文件内容c
|
|
fmt.Printf("%s:\n%s\n", f.Name, fileContent)
|
|
|
|
return nil
|
|
})
|
|
|
|
// 删除本地仓库
|
|
Info("Removing the local repository")
|
|
err = os.RemoveAll(directory)
|
|
CheckIfError(err)
|
|
}
|