Git
Chapters ▾ 2nd Edition

A2.4 Додатак B: Уграђивање програма Гит у ваше апликације - go-git

go-git

У случају да Гит желите да интегришете у сервис написан на Golang језику, постоји такође и чиста Go имплементација библиотеке. Ова имплементација нема никакве природне зависности, па није склона грешкама услед ручног управљања меморијом. Такође је транспарентна за стандардне Golang алате за анализу перформанси као што су CPU, Профилисање меморије, детектор race услова, итд.

go-git је фокусиран на проширивост, компатибилност и подржава већину водоводног API, што је документовано у https://github.com/go-git/go-git/blob/master/COMPATIBILITY.md.

Ево основног примера употребе Go API:

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 има неколико запажених могућности, а једна од њих је систем складиштења који може да се проширује, што личи на Libgit2 позадинске механизме. Подразумевана имплементација је складиштење унутар меморије, што је веома брзо.

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

Прошириво складиште нуди много интересантних опција. На пример, 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 је једноставно да се сви фајлови чувају на различите начине нпр. да се сви упакују у једну архиву на диску или да се дви чувају унутар меморије.

Још један напредни случај коришћења је фино подесиви 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 могућности излази ван оквира ове књиге. Ако желите више информација у вези go-git, на адреси https://pkg.go.dev/github.com/go-git/go-git/v5 се налази API документација, а скуп примера употребе на адреси https://github.com/go-git/go-git/tree/master/_examples.