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