Git 🌙
Chapters ▾ 2nd Edition

A2.4 Dodatek B: Vdelava Gita v vašo aplikacijo - go-git

go-git

V primeru, da želite integrirati Git v storitev napisano v Golangu, obstaja tudi čista implementacija knjižnice Go. Ta implementacija nima nobenih odvisnosti in zato ni nagnjena k napakam ročnega upravljanja s pomnilnikom. Prav tako je pregledna za standardna orodja za analizo uspešnosti Golang, kot so analizatorji CPU, pomnilnika, iskalnikov tveganih stanj (angl. race condition) itd.

go-git je osredotočen na razširljivost, združljivost in podpira večino API-jev napeljav, ki so dokumentirani na spletnem mestu https://github.com/go-git/go-git/blob/master/COMPATIBILITY.md.

Tu je osnovni primer uporabe Go API-jev:

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,
})

Takoj, ko imate instanco Repository, lahko dostopate do informacij in na njih izvajate mutacije:

// 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)
}

Napredna funkcionalnost

go-git ima nekaj pomembnih naprednih funkcij, ena izmed njih je vtični sistem za shranjevanje, ki je podoben zaledju Libgit2. Privzeta izvedba je shranjevanje v pomnilniku, kar je zelo hitro.

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

Priklopljivo shranjevanje ponuja veliko zanimivih možnosti. Na primer, https://github.com/go-git/go-git/tree/master/_examples/storage vam omogoča shranjevanje sklicev, objektov in konfiguracije v bazo podatkov Aerospike.

Druga funkcija je prilagodljiv abstraktni sistem datotečnega sistema. Z uporabo https://pkg.go.dev/github.com/go-git/go-billy/v5?tab=doc#Filesystem je enostavno shranjevati vse datoteke na različne načine, na primer tako, da vse zapakiramo v eno arhivsko datoteko na disku ali pa vse hranimo v pomnilniku.

Druga napredna uporaba vključuje prilagodljiv odjemalec HTTP, kot je tisti najden na 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})

Nadaljnje branje

Celoten opis zmogljivosti go-git presega obseg te knjige. Če želite več informacij o go-git, lahko najdete dokumentacijo API na spletnem mestu https://pkg.go.dev/github.com/go-git/go-git/v5 in nabor uporabnih primerov na https://github.com/go-git/go-git/tree/master/_examples.

scroll-to-top