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 är därför inte benägen att ge manuella minneshanteringsfel. Den är också transparent för standardverktyg i Go 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 göra förändringar 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 den hä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.