Skip to content

Commit 95cf080

Browse files
committed
update the B-embedding-git appendix and create some new files
1 parent 36faf0d commit 95cf080

File tree

6 files changed

+207
-82
lines changed

6 files changed

+207
-82
lines changed
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
1-
[#B-embedding-git]
1+
[[B-embedding-git-in-your-applications]]
22
[appendix]
33
== Ενσωμάτωση του Git στις εφαρμογές μας
44

55
Εάν η εφαρμογή μας απευθύνεται σε προγραμματιστές, οι πιθανότητες ότι θα επωφεληθούν από την ενοποίηση με τον έλεγχο εκδόσεων του πηγαίου κώδικα είναι πολλές.
66
Ακόμη και οι εφαρμογές που δεν αφορούν προγραμματιστές, όπως επεξεργασία εγγράφων, θα μπορούσαν ενδεχομένως να επωφεληθούν από τις λειτουργίες ελέγχου εκδόσεων και το μοντέλο του Git λειτουργεί πολύ καλά για πολλά διαφορετικά σενάρια.
77

8-
Εάν χρειάζεται να ενσωματώσουμε το Git με την εφαρμογή μας, έχουμε ουσιαστικά τρεις επιλογές: α) εκκίνηση κελύφους και χρήση του εργαλείου γραμμής εντολών Git, β) το Libgit2 και γ) το JGit.
8+
Εάν χρειάζεται να ενσωματώσουμε το Git με την εφαρμογή μας, έχουμε ουσιαστικά δύο επιλογές: α) εκκίνηση κελύφους και να καλέσουμε το `git` πρόγραμμα γραμμή-εντολής, ή να ενσωματώσουμε μια Git βιβλιοθήκη μέσα σστην εφαρμογή μας.
9+
Εδώ θα καλύψουμε την ενσωμάτωση γραμμή-εντολής και μερικές από τις πιο γνωστές ενσωματώσιμες βιβλιοθήκες του Git.
910

1011
include::book/B-embedding-git/sections/command-line.asc[]
1112

1213
include::book/B-embedding-git/sections/libgit2.asc[]
1314

1415
include::book/B-embedding-git/sections/jgit.asc[]
16+
17+
include::book/B-embedding-git/sections/go-git.asc[]
18+
19+
include::book/B-embedding-git/sections/dulwich.asc[]

book/B-embedding-git/sections/command-line.asc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@
66
Ωστόσο, αυτή η προσέγγιση έχει κάποια μειονεκτήματα.
77

88
Το ένα είναι ότι όλη η έξοδος είναι σε απλό κείμενο.
9-
Αυτό σημαίνει ότι θα πρέπει να αναλύσουμε την περιστασιακά μεταβαλλόμενη μορφή εξόδου του Git για να διαβάσουμε πληροφορίες σχετικά με την πρόοδο και τα αποτελέσματα, κάτι που μπορεί να είναι αναποτελεσματικό και επιρρεπές σε σφάλματα.
9+
Αυτό σημαίνει ότι θα πρέπει να αναλύσουμε την περιστασιακά μεταβαλλόμενη μορφή εξόδου του Git για να διαβάσουμε πληροφορίες σχετικά με την πρόοδο και τα αποτελέσματα, κάτι που μπορεί να είναι μη αποτελεσματικό και επιρρεπές σε σφάλματα.
1010

1111
Ένα άλλο είναι η έλλειψη ανάκτησης σφαλμάτων.
12-
Εάν ένα αποθετήριο είναι παρεφθαρμένο κατά κάποιο τρόπο ή ο χρήστης έχει μια μη-έγκυρη τιμή διαμόρφωσης, το Git απλά θα αρνηθεί να εκτελέσει πολλές λειτουργίες.
12+
Εάν ένα αποθετήριο είναι παρεφθαρμένο κατά κάποιο τρόπο, ή ο χρήστης έχει μια μη-έγκυρη τιμή διαμόρφωσης, το Git απλά θα αρνηθεί να εκτελέσει πολλές λειτουργίες.
1313

1414
Ένα ακόμα είναι η διαχείριση της διαδικασίας.
1515
Το Git απαιτεί να διατηρούμε ένα περιβάλλον κελύφους ως ξεχωριστή διαδικασία, κάτι που μπορεί να προσθέσει ανεπιθύμητη πολυπλοκότητα.
1616
Η προσπάθεια συντονισμού πολλών από αυτές τις διεργασίες (ειδικά όταν δυνητικά έχουμε πρόσβαση στο ίδιο αποθετήριο από διάφορες διεργασίες) μπορεί να είναι μια μεγάλη πρόκληση.
17-
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
=== Dulwich
2+
3+
(((Dulwich)))(((Python)))
4+
Υπάρχει επίσης μια καθαρή υλοποίση του Git σε Python - Dulwich.
5+
Το project φιλοξενείται στο https://www.dulwich.io/[^].
6+
Στοχεύει στην παροχή μιας διεπαφής με τα Git αποθετήρια (τοπικά και απομακρυσμένα) που δεν καλεί το Git απευθείας αλλά, αντιθέτως, χρησιμοποιεί μόνο Python.
7+
Έχει προαιρετικές C επεκτάσεις όμως, που βελτιώνουν σημαντικά την απόδοση.
8+
9+
Το Dulwich ακολουθεί το σχεδιασμό του Git και διαχωρίζει δύο βασικά επίπεδα API: τη διοχέτευση (plumbing) και πορσελάνη (porcelain).
10+
11+
Ακολουθεί ένα παράδειγμα που χρησιμοποιεί χαμηλού επιπέδου API για την πρόσβαση στο μήνυμα υποβολής της τελευταίας υποβολής:
12+
13+
[source, python]
14+
----
15+
from dulwich.repo import Repo
16+
r = Repo('.')
17+
r.head()
18+
# '57fbe010446356833a6ad1600059d80b1e731e15'
19+
20+
c = r[r.head()]
21+
c
22+
# <Commit 015fc1267258458901a94d228e39f0a378370466>
23+
24+
c.message
25+
# 'Add note about encoding.\n'
26+
----
27+
28+
Για να εκτυπώσουμε το log μιας υποβολής χρησιμοποιώντας υψηλού επιπέδου πορσελάνη (porcelain) API, μπορούμε να χρησιμοποιήσουμε:
29+
30+
[source, python]
31+
----
32+
from dulwich import porcelain
33+
porcelain.log('.', max_entries=1)
34+
35+
#commit: 57fbe010446356833a6ad1600059d80b1e731e15
36+
#Author: Jelmer Vernooij <[email protected]>
37+
#Date: Sat Apr 29 2017 23:57:34 +0000
38+
----
39+
40+
==== Περαιτέρω Ανάγνωση
41+
42+
Η τεκμηρίωση API, μαθήματα (tutorial), και πολλά παραδείγματα για το πως να κάνουμε συγκεκριμένες εργασίες (tasks) με το Dulwich είναι διαθέσιμα στην επίσημη ιστοσελίδα https://www.dulwich.io[^].
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
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

Comments
 (0)