Git 🌙
Chapters ▾ 2nd Edition

10.4 Приложение B: Вграждане на Git в приложения - go-git

go-git

В случай, че желаете да интегрирате Git в услуга написана на Go, съществува pure Go библиотечна имплементация. Тази имплементация няма никакви нативни зависимости и по тази причина е неподатлива на manual memory management грешки. Също така е прозрачна за стандартните Golang performance analysis инструментариуми като CPU, Memory profilers, race detector, и т.н.

go-git акцентира върху разширяемостта и съвместимостта и поддържа повечето plumbing APIs, документирани на https://github.com/go-git/go-git/blob/master/COMPATIBILITY.md.

Ето прост пример за използването на Go APIs:

import "github.com/go-git/go-git/v5"

r, err := git.PlainClone("/tmp/foo", false, &git.CloneOptions{
    URL:      "https://github.com/go-git/go-git",
    Progress: os.Stdout,
})

След като имате инстанция Repository, можете да четете информация и да правите промени по нея:

// retrieves the branch pointed by HEAD
ref, err := r.Head()

// get the commit object, pointed by ref
commit, err := r.CommitObject(ref.Hash())

// retrieves the commit history
history, err := commit.History()

// iterates over the commits and print each
for _, c := range history {
    fmt.Println(c)
}

Разширена функционалност

go-git има няколко advanced възможности, които си заслужава да се посочат. Една от тях е pluggable storage системата, подобна на Libgit2 backend-ите. Имплементацията по подразбиране е in-memory storage и тя е много бърза.

r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
    URL: "https://github.com/go-git/go-git",
})

Pluggable storage системата осигурява много интересни опции. Например, https://github.com/go-git/go-git/tree/master/_examples/storage позволява да съхранявате референции, обекти и конфигурационни настройки в Aerospike база данни.

Друга функция е гъвкавата абстракция на файловата система. Посредством https://pkg.go.dev/github.com/go-git/go-billy/v5?tab=doc#Filesystem е лесно да се съхраняват всички файлове по различен начин, например като се пакетират в единичен архив на диска или като се запазват всички in-memory.

Друг advanced use-case включва HTTP клиент с фина настройка, като този от https://github.com/go-git/go-git/blob/master/_examples/custom_http/main.go.

customClient := &http.Client{
    Transport: &http.Transport{ // accept any certificate (might be useful for testing)
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
    },
    Timeout: 15 * time.Second,  // 15 second timeout
        CheckRedirect: func(req *http.Request, via []*http.Request) error {
        return http.ErrUseLastResponse // don't follow redirect
    },
}

// Override http(s) default protocol to use our custom client
client.InstallProtocol("https", githttp.NewClient(customClient))

// Clone repository using the new client if the protocol is https://
r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{URL: url})

Допълнителна информация

Извън обхвата на тази книга е да разглеждаме всички поддържани от go-git възможности. Ако се нуждаете от подробности, налична е API документация на адрес https://pkg.go.dev/github.com/go-git/go-git/v5, както и комплект от примери на https://github.com/go-git/go-git/tree/master/_examples.

scroll-to-top