|
| 1 | +=== go-git |
| 2 | + |
| 3 | +(((go-git)))(((Go))) |
| 4 | +Σε περίπτωση που θέλουμε να ενσωματώσουμε το Git σε μια υπηρεσία γραμμένη σε Golang, υπάρχει επίσης μια καθαρή υλοποίηση βιβλιοθήκης σε Go. |
| 5 | +Αυτή η υλοποίηση δεν έχει εγγενείς εξαρτήσεις και για αυτο δεν είναι επιρρεπής σε χειροκίνητη διαχείριση σφαλμάτων μνήμης. |
| 6 | +Είναι επίσης διαφανής για τα τυπικά εργαλεία ανάλυσης απόδοσης της Golang όπως CPU, προφίλ Μνήμης, ανιχνευτής αγώνα (race detector), κτλ. |
| 7 | + |
| 8 | +Το go-git στοχεύει στην επεκτασιμότητα, συμβατότητα και υποστηρίζει τα περισσότερα APIs διοχέτευσης, που είναι την τεκμηρίωση https://github.com/go-git/go-git/blob/master/COMPATIBILITY.md[^]. |
| 9 | + |
| 10 | +Ένα σύνηθες παράδειγμα χρήσης των Go APIs: |
| 11 | + |
| 12 | +[source, go] |
| 13 | +---- |
| 14 | +import "github.com/go-git/go-git/v5" |
| 15 | +
|
| 16 | +r, err := git.PlainClone("/tmp/foo", false, &git.CloneOptions{ |
| 17 | + URL: "https://github.com/go-git/go-git", |
| 18 | + Progress: os.Stdout, |
| 19 | +}) |
| 20 | +---- |
| 21 | + |
| 22 | +Μόλις έχουμε ένα στιγμιότυπο `Repository`, έχουμε πρόσβαση στις πληροφορίες και να κάνουμε μεταλλάξεις σε αυτό: |
| 23 | + |
| 24 | +[source, go] |
| 25 | +---- |
| 26 | +// retrieves the branch pointed by HEAD |
| 27 | +ref, err := r.Head() |
| 28 | +
|
| 29 | +// get the commit object, pointed by ref |
| 30 | +commit, err := r.CommitObject(ref.Hash()) |
| 31 | +
|
| 32 | +// retrieves the commit history |
| 33 | +history, err := commit.History() |
| 34 | +
|
| 35 | +// iterates over the commits and print each |
| 36 | +for _, c := range history { |
| 37 | + fmt.Println(c) |
| 38 | +} |
| 39 | +---- |
| 40 | + |
| 41 | +==== Προηγμένη Λειτουργικότητα |
| 42 | + |
| 43 | +Το go-git έχει μερικά αξιοσημείωτα προηγμένα χαρακτηριστικά, ένα από αυτά είναι το συνδεούμενο (pluggable) σύστημα αποθήκευσης, που είναι το ίδιο με την υλοποίηση του Libgit2. |
| 44 | +Η προεπιλεγμένη υλοποίηση είναι εντός-μνήμη αποθήκευση, που είναι πολύ γρήγορη. |
| 45 | + |
| 46 | +[source, go] |
| 47 | +---- |
| 48 | +r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{ |
| 49 | + URL: "https://github.com/go-git/go-git", |
| 50 | +}) |
| 51 | +---- |
| 52 | + |
| 53 | +Το συνδεούμενο (pluggable) σύστημα προσφέρει πολλές ενδιαφέρουσες επιλογές. |
| 54 | +Για παράδειγμα, https://github.com/go-git/go-git/tree/master/_examples/storage[^] μας επιτρέπει να αποθηκεύουμε αναφορές, αντικείμενα, και διαμόρφωση (configuration) σε μια βάση Aerospike. |
| 55 | + |
| 56 | +Ένα άλλο χαρακτηριστικό είναι η ευέλικτη αφαίρεση συστήματος αρχείων (flexible filesystem abstraction). |
| 57 | +Χρησιμοποιώντας https://pkg.go.dev/github.com/go-git/go-billy/v5?tab=doc#Filesystem[^] είναι πολύ εύκολο να αποθηκεύσουμε όλα τα αρχεία με διαφορετικό τρόπο π.χ. πακετάρωντάς τα όλα σε ένα αρχείο στο δίσκο ή κρατώντας τα όλα εντός-μνήμης. |
| 58 | + |
| 59 | +Μια άλλη προηγμένη περίπτωση-χρήσης περιλαμβάνει ένα βελτιστοποιημένο πελάτη HTTP, σαν αυτό που βρίσκεται https://github.com/go-git/go-git/blob/master/_examples/custom_http/main.go[^]. |
| 60 | + |
| 61 | +[source, go] |
| 62 | +---- |
| 63 | +customClient := &http.Client{ |
| 64 | + Transport: &http.Transport{ // accept any certificate (might be useful for testing) |
| 65 | + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, |
| 66 | + }, |
| 67 | + Timeout: 15 * time.Second, // 15 second timeout |
| 68 | + CheckRedirect: func(req *http.Request, via []*http.Request) error { |
| 69 | + return http.ErrUseLastResponse // don't follow redirect |
| 70 | + }, |
| 71 | +} |
| 72 | +
|
| 73 | +// Override http(s) default protocol to use our custom client |
| 74 | +client.InstallProtocol("https", githttp.NewClient(customClient)) |
| 75 | +
|
| 76 | +// Clone repository using the new client if the protocol is https:// |
| 77 | +r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{URL: url}) |
| 78 | +---- |
| 79 | + |
| 80 | +==== Περαιτέρω ανάγνωση |
| 81 | + |
| 82 | +Μια πλήρης διαχείριση των δυνατοτήτων του go-git είναι εκτός θέματος του βιβλίου. |
| 83 | +Αν θέλουμε περισσότερες πληροφορίες για το go-git, υπάρχει μια API τεκμηρίωση εδώ https://pkg.go.dev/github.com/go-git/go-git/v5[^], και ένα σύνολο παραδειγμάτων εδώ https://github.com/go-git/go-git/tree/master/_examples[^]. |
0 commit comments