Git
Chapters ▾ 2nd Edition

A2.4 Appendix B: Proqramlara Git Daxil Etmək - go-git

go-git

Git’i Golang’da yazılmış bir xidmətə inteqrasiya etmək istədiyiniz təqdirdə təmiz bir Go kitabxanası tətbiqi də mövcuddur. Bu tətbiqin heç bir yerli asılılığı yoxdur və bu səbəbdən manual yaddaş idarəetməsi səhvlərinə meylli deyil. CPU, Yaddaş profilləri, race detektoru və s. kimi standart Golang performans analizi alətləri üçün də transparent-dır.

go-git genişlənməyə, uyğunluğa yönəldilib və https://github.com/go-git/go-git/blob/master/COMPATIBILITY.md sənədləşdirilmiş santexnika API-lərinin çoxunu dəstəkləyir.

Go API-lərindən istifadənin əsas nümunəsi:

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

Bir Depo nümunəsinə sahib olduqdan sonra məlumat əldə edə və üzərində mutasiyalar həyata keçirə bilərsiniz:

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

Ətraflı Funksionallıq

go-git-in az nəzərə çarpan inkişaf etmiş xüsusiyyətləri vardır, bunlardan biri də Libgit2 arxa planlarına bənzər bir taxılan saxlama sistemidir. Varsayılan tətbiq çox sürətli olan yaddaş içi depolamadır.

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

Taxıla bilən yaddaş bir çox maraqlı seçim təqdim edir. Məsələn, https://github.com/go-git/go-git/tree/master/_examples/storage istinadlar, obyektlər və konfiqurasiyanı Aerokosmik bazasında saxlamağa imkan verir.

Digər bir xüsusiyyət çevik bir fayl sistemi soyutlamasıdır. https://pkg.go.dev/github.com/go-git/go-billy/v5?tab=doc#Filesystem istifadə edərək, bütün sənədləri fərqli şəkildə, hamısını qablaşdırmaqla saxlamaq asandır. Yəni diskdə bir arxiv və ya hamısını yaddaşda saxlamaq olar.

Başqa bir inkişaf etmiş istifadəyə, https://github.com/go-git/go-git/blob/master/_examples/custom_http/main.go da tapılan kimi yaxşı tənzimlənən HTTP müştərisi daxildir.

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

Əlavə Oxu

Go-git qabiliyyətlərinin tam müalicəsi bu kitabın əhatəsi xaricindədir. Go-git haqqında daha çox məlumat istəyirsinizsə, https://pkg.go.dev/github.com/go-git/go-git/v5ünvanında API sənədləri və https://github.com/go-git/go-git/tree/master/_examples-də bir sıra istifadə nümunələri var.