-
1. Erste Schritte
- 1.1 Über Versionskontrolle
- 1.2 Eine kurze Geschichte von Git
- 1.3 Was ist Git?
- 1.4 Die Kommandozeile
- 1.5 Git installieren
- 1.6 Erstmalige Git-Einrichtung
- 1.7 Hilfe bekommen
- 1.8 Zusammenfassung
-
2. Git Grundlagen
-
3. Git Branching
- 3.1 Branches im Überblick
- 3.2 Grundlegendes Branching und Merging
- 3.3 Branch-Management
- 3.4 Branching-Workflows
- 3.5 Remote-Branches
- 3.6 Rebasing
- 3.7 Zusammenfassung
-
4. Git auf dem Server
- 4.1 Die Protokolle
- 4.2 Git auf einem Server einrichten
- 4.3 Generieren Ihres SSH-Public-Keys
- 4.4 Einrichten des Servers
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Drittanbieter-Hosting-Optionen
- 4.10 Zusammenfassung
-
5. Verteiltes Git
-
6. GitHub
-
7. Git-Werkzeuge
- 7.1 Revisionsauswahl
- 7.2 Interaktives Staging
- 7.3 Stashing und Bereinigen
- 7.4 Ihre Arbeit signieren
- 7.5 Suchen
- 7.6 Historie umschreiben
- 7.7 Reset entmystifiziert
- 7.8 Fortgeschrittenes Merging
- 7.9 Rerere
- 7.10 Debugging mit Git
- 7.11 Submodule
- 7.12 Bundling
- 7.13 Ersetzen
- 7.14 Credential-Speicher
- 7.15 Zusammenfassung
-
8. Git anpassen
-
9. Git und andere Systeme
- 9.1 Git als Client
- 9.2 Migration zu Git
- 9.3 Zusammenfassung
-
10. Git-Interna
- 10.1 Plumbing und Porcelain
- 10.2 Git-Objekte
- 10.3 Git-Referenzen
- 10.4 Packfiles
- 10.5 Die Refspec
- 10.6 Übertragungsprotokolle
- 10.7 Wartung und Datenwiederherstellung
- 10.8 Umgebungsvariablen
- 10.9 Zusammenfassung
-
Anhang A: Git in anderen Umgebungen
- A1.1 Grafische Oberflächen
- A1.2 Git in Visual Studio
- A1.3 Git in Visual Studio Code
- A1.4 Git in IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git in Sublime Text
- A1.6 Git in Bash
- A1.7 Git in Zsh
- A1.8 Git in PowerShell
- A1.9 Zusammenfassung
-
Anhang B: Git in Ihre Anwendungen einbetten
- A2.1 Kommandozeilen-Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
Anhang C: Git-Befehle
- A3.1 Einrichtung und Konfiguration
- A3.2 Projekte abrufen und erstellen
- A3.3 Grundlegendes Snapshotting
- A3.4 Branching und Merging
- A3.5 Projekte teilen und aktualisieren
- A3.6 Inspektion und Vergleich
- A3.7 Debugging
- A3.8 Patching
- A3.9 E-Mail
- A3.10 Externe Systeme
- A3.11 Administration
- A3.12 Plumbing-Befehle
A2.4 Anhang B: Git in Ihre Anwendungen einbetten - go-git
go-git
Wenn Sie Git in einen in Golang geschriebenen Dienst integrieren möchten, gibt es auch eine reine Go-Bibliotheksimplementierung. Diese Implementierung hat keine nativen Abhängigkeiten und ist somit nicht anfällig für Fehler bei der manuellen Speicherverwaltung. Sie ist auch transparent für die Standard-Golang-Performance-Analysewerkzeuge wie CPU-, Speicherprofiler, Race-Detektor usw.
go-git konzentriert sich auf Erweiterbarkeit und Kompatibilität und unterstützt die meisten Plumbing-APIs, wie auf https://github.com/go-git/go-git/blob/master/COMPATIBILITY.md dokumentiert.
Hier ist ein einfaches Beispiel für die Verwendung von 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,
})
Sobald Sie eine Repository-Instanz haben, können Sie darauf zugreifen und Änderungen vornehmen
// 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)
}
Erweiterte Funktionalität
go-git hat einige bemerkenswerte erweiterte Funktionen, von denen eine ein erweiterbares Speichersystem ist, das Libgit2-Backends ähnelt. Die Standardimplementierung ist der In-Memory-Speicher, der sehr schnell ist.
r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
URL: "https://github.com/go-git/go-git",
})
Der erweiterbare Speicher bietet viele interessante Optionen. Zum Beispiel ermöglicht Ihnen https://github.com/go-git/go-git/tree/master/_examples/storage das Speichern von Referenzen, Objekten und Konfigurationen in einer Aerospike-Datenbank.
Eine weitere Funktion ist eine flexible Dateisystemabstraktion. Mit https://pkg.go.dev/github.com/go-git/go-billy/v5?tab=doc#Filesystem ist es einfach, alle Dateien auf unterschiedliche Weise zu speichern, z. B. indem Sie sie alle in einem einzigen Archiv auf der Festplatte packen oder sie alle im Speicher behalten.
Ein weiterer fortgeschrittener Anwendungsfall umfasst einen feinabstimmbaren HTTP-Client, wie er unter https://github.com/go-git/go-git/blob/master/_examples/custom_http/main.go zu finden ist.
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})
Weiterführende Literatur
Eine vollständige Behandlung der Fähigkeiten von go-git liegt außerhalb des Rahmens dieses Buches. Wenn Sie weitere Informationen zu go-git wünschen, finden Sie die API-Dokumentation unter https://pkg.go.dev/github.com/go-git/go-git/v5 und eine Reihe von Anwendungsbeispielen unter https://github.com/go-git/go-git/tree/master/_examples.