-
1. Начало
- 1.1 За Version Control системите
- 1.2 Кратка история на Git
- 1.3 Какво е Git
- 1.4 Конзолата на Git
- 1.5 Инсталиране на Git
- 1.6 Първоначална настройка на Git
- 1.7 Помощна информация в Git
- 1.8 Обобщение
-
2. Основи на Git
-
3. Клонове в Git
-
4. GitHub
-
5. Git инструменти
- 5.1 Избор на къмити
- 5.2 Интерактивно индексиране
- 5.3 Stashing и Cleaning
- 5.4 Подписване на вашата работа
- 5.5 Търсене
- 5.6 Манипулация на историята
- 5.7 Мистерията на командата Reset
- 5.8 Сливане за напреднали
- 5.9 Rerere
- 5.10 Дебъгване с Git
- 5.11 Подмодули
- 5.12 Пакети в Git (Bundling)
- 5.13 Заместване
- 5.14 Credential Storage система
- 5.15 Обобщение
-
6. Настройване на Git
- 6.1 Git конфигурации
- 6.2 Git атрибути
- 6.3 Git Hooks
- 6.4 Примерна Git-Enforced политика
- 6.5 Обобщение
-
7. Git и други системи
- 7.1 Git като клиент
- 7.2 Миграция към Git
- 7.3 Обобщение
-
8. Git на ниско ниво
- 8.1 Plumbing и Porcelain команди
- 8.2 Git обекти
- 8.3 Git референции
- 8.4 Packfiles
- 8.5 Refspec спецификации
- 8.6 Транспортни протоколи
- 8.7 Поддръжка и възстановяване на данни
- 8.8 Environment променливи
- 8.9 Обобщение
-
9. Приложение A: Git в други среди
-
10. Приложение B: Вграждане на Git в приложения
- 10.1 Git от команден ред
- 10.2 Libgit2
- 10.3 JGit
- 10.4 go-git
- 10.5 Dulwich
-
A1. Приложение C: Git команди
- A1.1 Настройки и конфигурация
- A1.2 Издърпване и създаване на проекти
- A1.3 Snapshotting
- A1.4 Клонове и сливане
- A1.5 Споделяне и обновяване на проекти
- A1.6 Инспекция и сравнение
- A1.7 Дебъгване
- A1.8 Patching
- A1.9 Email команди
- A1.10 Външни системи
- A1.11 Административни команди
- A1.12 Plumbing команди
10.4 Приложение B: Вграждане на Git в приложения - go-git
go-git
В случай, че желаете да интегрирате Git в услуга написана на Go, съществува pure Go библиотечна имплементация. Тази имплементация няма никакви нативни зависимости и по тази причина е неподатлива на manual memory management грешки. Също така е прозрачна за стандартните Golang performance analysis инструментариуми като CPU, Memory profilers, race detector, и т.н.
go-git акцентира върху разширяемостта и съвместимостта и поддържа повечето plumbing APIs, документирани на https://github.com/go-git/go-git/blob/master/COMPATIBILITY.md.
Ето прост пример за използването на Go APIs:
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,
})
След като имате инстанция Repository
, можете да четете информация и да правите промени по нея:
// 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 има няколко advanced възможности, които си заслужава да се посочат. Една от тях е pluggable storage системата, подобна на Libgit2 backend-ите. Имплементацията по подразбиране е in-memory storage и тя е много бърза.
r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
URL: "https://github.com/go-git/go-git",
})
Pluggable storage системата осигурява много интересни опции. Например, https://github.com/go-git/go-git/tree/master/_examples/storage позволява да съхранявате референции, обекти и конфигурационни настройки в Aerospike база данни.
Друга функция е гъвкавата абстракция на файловата система. Посредством https://pkg.go.dev/github.com/go-git/go-billy/v5?tab=doc#Filesystem е лесно да се съхраняват всички файлове по различен начин, например като се пакетират в единичен архив на диска или като се запазват всички in-memory.
Друг advanced use-case включва HTTP клиент с фина настройка, като този от 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})
Допълнителна информация
Извън обхвата на тази книга е да разглеждаме всички поддържани от go-git възможности. Ако се нуждаете от подробности, налична е API документация на адрес https://pkg.go.dev/github.com/go-git/go-git/v5, както и комплект от примери на https://github.com/go-git/go-git/tree/master/_examples.