-
1. Ξεκινώντας με το Git
-
2. Τα θεμελιώδη στοιχεία του Git
-
3. Διακλαδώσεις στο Git
-
4. Το Git στον διακομιστή
- 4.1 Τα πρωτόκολλα
- 4.2 Εγκατάσταση του Git σε διακομιστή
- 4.3 Δημιουργία δημόσιου κλειδιού SSH
- 4.4 Στήσιμο του διακομιστή
- 4.5 Δαίμονες του Git
- 4.6 Έξυπνο HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Επιλογές φιλοξενίας από τρίτους
- 4.10 Ανακεφαλαίωση
-
5. Κατανεμημένο Git
-
6. GitHub
-
7. Εργαλεία του Git
- 7.1 Επιλογή αναθεώρησης
- 7.2 Διαδραστική εργασία με το στάδιο καταχώρισης
- 7.3 Αποθέματα και Καθαρισμός
- 7.4 Υπογραφή της δουλειάς μας
- 7.5 Αναζήτηση
- 7.6 Η ιστορία ξαναγράφεται
- 7.7 Απομυθοποίηση της reset
- 7.8 Προχωρημένη Συγχώνευση
- 7.9 Rerere
- 7.10 Αποσφαλμάτωση με το Git
- 7.11 Υπομονάδες
- 7.12 Δεμάτιασμα δεδομένων
- 7.13 Replace
- 7.14 Αποθήκευση διαπιστευτηρίων
- 7.15 Ανακεφαλαίωση
-
8. Εξατομίκευση του Git
-
9. Το Git και άλλα συστήματα
- 9.1 Το Git ως πελάτης
- 9.2 Μετανάστευση στο Git
- 9.3 Ανακεφαλαίωση
-
10. Εσωτερική λειτουργία του Git
- 10.1 Διοχετεύσεις και πορσελάνες
- 10.2 Αντικείμενα του Git
- 10.3 Αναφορές του Git
- 10.4 Πακετάρισμα αρχείων
- 10.5 Τα refspec
- 10.6 Πρωτόκολλα μεταφοράς
- 10.7 Διατήρηση και ανάκτηση δεδομένων
- 10.8 Μεταβλητές περιβάλλοντος
- 10.9 Ανακεφαλαίωση
-
A1. Appendix A: Το Git σε άλλα περιβάλλοντα
- A1.1 Γραφικές διεπαφές
- A1.2 Το Git στο Visual Studio
- A1.3 Git στο Visual Studio Code
- A1.4 Git στο IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git στο Sublime Text
- A1.6 Το Git στο Bash
- A1.7 Το Git στο Zsh
- A1.8 Το Git στο Powershell
- A1.9 Ανακεφαλαίωση
-
A2. Appendix B: Ενσωμάτωση του Git στις εφαρμογές μας
- A2.1 Γραμμή εντολών Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Appendix C: Εντολές Git
- A3.1 Ρύθμιση και διαμόρφωση
- A3.2 Λήψη και δημιουργία έργων
- A3.3 Βασική λήψη στιγμιοτύπων
- A3.4 Διακλάδωση και συγχώνευση
- A3.5 Κοινή χρήση και ενημέρωση έργων
- A3.6 Επιθεώρηση και σύγκριση
- A3.7 Αποσφαλμάτωση
- A3.8 Επιθέματα
- A3.9 Ηλεκτρονικό ταχυδρομείο
- A3.10 Εξωτερικά Συστήματα
- A3.11 Διοίκηση
- A3.12 Εντολές διοχέτευσης
A2.4 Appendix B: Ενσωμάτωση του Git στις εφαρμογές μας - go-git
go-git
Σε περίπτωση που θέλουμε να ενσωματώσουμε το Git σε μια υπηρεσία γραμμένη σε Golang, υπάρχει επίσης μια καθαρή υλοποίηση βιβλιοθήκης σε Go. Αυτή η υλοποίηση δεν έχει εγγενείς εξαρτήσεις και για αυτο δεν είναι επιρρεπής σε χειροκίνητη διαχείριση σφαλμάτων μνήμης. Είναι επίσης διαφανής για τα τυπικά εργαλεία ανάλυσης απόδοσης της Golang όπως CPU, προφίλ Μνήμης, ανιχνευτής αγώνα (race detector), κτλ.
Το go-git στοχεύει στην επεκτασιμότητα, συμβατότητα και υποστηρίζει τα περισσότερα 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 έχει μερικά αξιοσημείωτα προηγμένα χαρακτηριστικά, ένα από αυτά είναι το συνδεούμενο (pluggable) σύστημα αποθήκευσης, που είναι το ίδιο με την υλοποίηση του Libgit2. Η προεπιλεγμένη υλοποίηση είναι εντός-μνήμη αποθήκευση, που είναι πολύ γρήγορη.
r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
URL: "https://github.com/go-git/go-git",
})
Το συνδεούμενο (pluggable) σύστημα προσφέρει πολλές ενδιαφέρουσες επιλογές. Για παράδειγμα, https://github.com/go-git/go-git/tree/master/_examples/storage μας επιτρέπει να αποθηκεύουμε αναφορές, αντικείμενα, και διαμόρφωση (configuration) σε μια βάση Aerospike.
Ένα άλλο χαρακτηριστικό είναι η ευέλικτη αφαίρεση συστήματος αρχείων (flexible filesystem abstraction). Χρησιμοποιώντας https://pkg.go.dev/github.com/go-git/go-billy/v5?tab=doc#Filesystem είναι πολύ εύκολο να αποθηκεύσουμε όλα τα αρχεία με διαφορετικό τρόπο π.χ. πακετάρωντάς τα όλα σε ένα αρχείο στο δίσκο ή κρατώντας τα όλα εντός-μνήμης.
Μια άλλη προηγμένη περίπτωση-χρήσης περιλαμβάνει ένα βελτιστοποιημένο πελάτη 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 είναι εκτός θέματος του βιβλίου. Αν θέλουμε περισσότερες πληροφορίες για το go-git, υπάρχει μια API τεκμηρίωση εδώ https://pkg.go.dev/github.com/go-git/go-git/v5, και ένα σύνολο παραδειγμάτων εδώ https://github.com/go-git/go-git/tree/master/_examples.