Git
Chapters ▾ 2nd Edition

A2.4 Annexe B: Embarquer Git dans vos applications - go-git

go-git

Au cas où vous souhaiteriez intégrer Git dans un service écrit en Golang, il existe aussi une implantation de bibliothèque en pur Go. Cette implantation n’a aucune dépendance native et n’est donc pas susceptible de contenir des erreurs de gestion manuelle de mémoire. Elle est aussi transparente pour l’outillage standard d’analyse de performance de Golang tel que CPU, profileurs Memory, détecteurs de conditions de compétition, etc.

go-git est ciblé sur l’extensibilité, la compatibilité et gère la plupart des APIs de plomberie, qui sont documentées sur https://github.com/go-git/go-git/blob/master/COMPATIBILITY.md.

Voici un exemple simple d’utilisation des API Go :

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

Dès que vous avez une instance de Repository, vous pouvez accéder à ses informations et procéder à des modifications :

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

Fonctionnalités avancées

go-git a quelques fonctions avancées notables, dont une est un système de stockage modulaire, qui est similaire aux moteurs Libgit2. L’implantation par défaut est le stockage en mémoire, qui est extrêmement rapide.

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

Le stockage enfichable fournit de nombreuses options intéressantes. Par exemple, https://github.com/go-git/go-git/tree/master/_examples/storage vous permet de stocker des références, des objets, et la configuration dans une base de données Aerospike.

Un autre fonctionnalité est une abstraction flexible de système de fichier. En utilisant https://pkg.go.dev/github.com/go-git/go-billy/v5?tab=doc#Filesystem il est simple de stocker tous les fichiers de différentes manières, par exemple, en les empaquetant tous dans un archive unique sur un disque ou en les conservant en mémoire.

Une autre utilisation avancée inclut un client HTTP hautement paramétrable, tel que celui de 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})

Pour plus d’informations

Une couverture complète des capacités de go-git dépasse le cadre de ce livre. Si vous souhaitez plus d’information sur go-git, la documentation de l’API se trouve sur https://pkg.go.dev/github.com/go-git/go-git/v5, et en ensemble d’exemples d’utilisation sur https://github.com/go-git/go-git/tree/master/_examples.