Chapters ▾ 2nd Edition

A2.4 Bilaga B: Bädda in Git i dina applikationer - go-git

go-git

Om du vill integrera Git i en tjänst skriven i Go finns det också en ren Go‑biblioteksimplementation. Den här implementationen har inga inbyggda beroenden och riskerar därför inte manuella minneshanteringsfel. Den stöder också Gos standardverktyg för prestandaanalys som CPU‑ och minnesprofilerare, datakapplöpningsdetektor och liknande.

go-git fokuserar på utbyggbarhet och kompatibilitet samt stöder de flesta lågnivå‑API:er, vilket dokumenteras på https://github.com/go-git/go-git/blob/master/COMPATIBILITY.md.

Här är ett grundläggande exempel på att använda Go‑API:erna:

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

Så snart du har en Repository‑instans kan du hämta information och ändra i den:

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

Avancerad funktionalitet

go-git har några anmärkningsvärda avancerade funktioner, varav en är ett insticksbart lagringssystem som liknar Libgit2‑bakändar. Standardimplementeringen är lagring i minnet, vilket är mycket snabbt.

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

Insticksbar lagring ger många intressanta möjligheter. Till exempel låter https://github.com/go-git/go-git/tree/master/_examples/storage dig lagra referenser, objekt och konfiguration i en Aerospike‑databas.

En annan funktion är en flexibel abstraktion för filsystem. Med https://pkg.go.dev/github.com/go-git/go-billy/v5?tab=doc#Filesystem är det lätt att lagra alla filer på olika sätt, till exempel genom att packa dem till ett enda arkiv på disk eller genom att hålla dem helt i minnet.

Ett annat avancerat användningsfall är en finjusterbar HTTP‑klient, som den som finns på 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})

Vidare läsning

En fullständig genomgång av go-gits möjligheter ligger utanför bokens omfattning. Om du vill ha mer information om go-git finns API‑dokumentation på https://pkg.go.dev/github.com/go-git/go-git/v5 och en uppsättning användningsexempel på https://github.com/go-git/go-git/tree/master/_examples.