Skip to content

Commit 94f3595

Browse files
committed
update the rest 3/8 files of 10-git-internals module
1 parent 43102fd commit 94f3595

File tree

3 files changed

+69
-68
lines changed

3 files changed

+69
-68
lines changed

book/10-git-internals/sections/packfiles.asc

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
11
=== Πακετάρισμα αρχείων
22

3-
Ας επιστρέψουμε στη βάση δεδομένων των αντικειμένων για το δοκιμαστικό μας αποθετήριο Git.
4-
Σε αυτό το σημείο, έχουμε 11 αντικείμενα —4 blobs, 3 δέντρα, 3 υποβολές και 1 ετικέτα:
3+
Αν κάναμε όλα τα βήματα από το παράδειγμα της προηγούμενης ενότητας, τώρα θα πρέπει να έχουμε το δοκιμαστικό μας αποθετήριο Git με 11 αντικείμενα — τέσσερα blobs, τρία δέντρα, τρία υποβολές και μία ετικέτα:
54

65
[source,console]
76
----
87
$ find .git/objects -type f
9-
.git/objects/01/55eb4229851634a0f03eb265b69f5a2d56f341 # δέντρο 2
10-
.git/objects/1a/410efbd13591db07496601ebc7a059dd55cfe9 # υποβολή 3
8+
.git/objects/01/55eb4229851634a0f03eb265b69f5a2d56f341 # tree 2
9+
.git/objects/1a/410efbd13591db07496601ebc7a059dd55cfe9 # commit 3
1110
.git/objects/1f/7a7a472abf3dd9643fd615f6da379c4acb3e3a # test.txt v2
12-
.git/objects/3c/4e9cd789d88d8d89c1073707c3585e41b0e614 # δέντρο 3
11+
.git/objects/3c/4e9cd789d88d8d89c1073707c3585e41b0e614 # tree 3
1312
.git/objects/83/baae61804e65cc73a7201a7252750c76066a30 # test.txt v1
14-
.git/objects/95/85191f37f7b0fb9444f35a9bf50de191beadc2 # ετικέτα
15-
.git/objects/ca/c0cab538b970a37ea1e769cbbde608743bc96d # υποβολή 2
13+
.git/objects/95/85191f37f7b0fb9444f35a9bf50de191beadc2 # tag
14+
.git/objects/ca/c0cab538b970a37ea1e769cbbde608743bc96d # commit 2
1615
.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4 # 'test content'
17-
.git/objects/d8/329fc1cc938780ffdd9f94e0d364e0ea74f579 # δέντρο 1
16+
.git/objects/d8/329fc1cc938780ffdd9f94e0d364e0ea74f579 # tree 1
1817
.git/objects/fa/49b077972391ad58037050f2a75f74e3671e92 # new.txt
19-
.git/objects/fd/f4fc3344e67ab068f836878b6c4951e3b15f3d # υποβολή 1
18+
.git/objects/fd/f4fc3344e67ab068f836878b6c4951e3b15f3d # commit 1
2019
----
2120

2221
Το Git συμπιέζει τα περιεχόμενα αυτών των αρχείων με το zlib και δεν αποθηκεύουμε πολλά, έτσι ώστε όλα αυτά τα αρχεία έχουν αθροιστικά μόνο 925 byte.
@@ -26,16 +25,17 @@ $ find .git/objects -type f
2625
[source,console]
2726
----
2827
$ curl https://raw.githubusercontent.com/mojombo/grit/master/lib/grit/repo.rb > repo.rb
28+
$ git checkout master
2929
$ git add repo.rb
30-
$ git commit -m 'added repo.rb'
31-
[master 484a592] added repo.rb
30+
$ git commit -m 'Create repo.rb'
31+
[master 484a592] Create repo.rb
3232
3 files changed, 709 insertions(+), 2 deletions(-)
3333
delete mode 100644 bak/test.txt
3434
create mode 100644 repo.rb
3535
rewrite test.txt (100%)
3636
----
3737

38-
Αν κοιτάξουμε το δέντρο που προκύπτει, μπορούμε να δούμε την τιμή SHA-1 που έχει λάβει το αρχείο repo.rb για το αντικείμενο blob:
38+
Αν κοιτάξουμε το δέντρο που προκύπτει, μπορούμε να δούμε την τιμή SHA-1 που έχει λάβει το νέο αρχείο `repo.rb` για το αντικείμενο blob:
3939

4040
[source,console]
4141
----
@@ -58,8 +58,8 @@ $ git cat-file -s 033b4468fa6b2a9547a70d88d1bbe8bf3f9ed0d5
5858
[source,console]
5959
----
6060
$ echo '# testing' >> repo.rb
61-
$ git commit -am 'modified repo a bit'
62-
[master 2431da6] modified repo.rb a bit
61+
$ git commit -am 'Modify repo.rb a bit'
62+
[master 2431da6] Modify repo.rb a bit
6363
1 file changed, 1 insertion(+)
6464
----
6565

@@ -81,13 +81,13 @@ $ git cat-file -s b042a60ef7dff760008df33cee372b945b6e884e
8181
22054
8282
----
8383

84-
Έχουμε δύο σχεδόν ταυτόσημα αντικείμενα 22K στον δίσκο μας.
84+
Έχουμε δύο σχεδόν ταυτόσημα αντικείμενα 22K στον δίσκο μας (που το καθένα είναι συμπιεσμένο περίπου 7K).
8585
Δεν θα ήταν ωραίο αν το Git μπορούσε να αποθηκεύσει ένα από αυτά πλήρως, αλλά το δεύτερο αντικείμενο μόνο ως το δέλτα μεταξύ αυτού και του πρώτου;
8686

8787
Ε, λοιπόν, μπορεί.
88-
Η αρχική μορφή στην οποία το Git αποθηκεύει αντικείμενα στον δίσκο ονομάζεται _χαλαρή_ μορφή αντικειμένου.
89-
Εντούτοις, περιστασιακά το Git ``πακετάρει'' αρκετά από αυτά τα αντικείμενα σε ένα μόνο δυαδικό αρχείο που ονομάζεται πακέτο (packfile) για να εξοικονομήσει χώρο και να είναι πιο αποδοτικό.
90-
Το Git το κάνει αυτό εάν έχουμε πολλά χαλαρά αντικείμενα γύρω μας, αν εκτελέσουμε χειροκίνητα την εντολή `git gc` ή αν ωθήσουμε σε έναν απομακρυσμένο διακομιστή.
88+
Η αρχική μορφή στην οποία το Git αποθηκεύει αντικείμενα στον δίσκο ονομάζεται "`χαλαρή`" ("`loose`") μορφή αντικειμένου.
89+
Εντούτοις, περιστασιακά το Git πακετάρει αρκετά από αυτά τα αντικείμενα σε ένα μόνο δυαδικό αρχείο που ονομάζεται "`πακέτο`" ("`packfile`") για να εξοικονομήσει χώρο και να είναι πιο αποδοτικό.
90+
Το Git το κάνει αυτό εάν έχουμε πολλά χαλαρά αντικείμενα γενικώς, αν εκτελέσουμε χειροκίνητα την εντολή `git gc` ή αν ωθήσουμε σε έναν απομακρυσμένο διακομιστή.
9191
Για να δούμε τι συμβαίνει, μπορούμε να ζητήσουμε από το Git να συσκευάσει τα αντικείμενα καλώντας την εντολή `git gc`:
9292

9393
[source,console]
@@ -100,7 +100,7 @@ Writing objects: 100% (18/18), done.
100100
Total 18 (delta 3), reused 0 (delta 0)
101101
----
102102

103-
Αν κοιτάξουμε στον κατάλογο των αντικειμένων μας, θα διαπιστώσουμε ότι τα περισσότερα αντικείμενά μας έχουν εξαφανιστεί και εμφανίστηκε ένα νέο ζευγάρι αρχείων:
103+
Αν κοιτάξουμε στον κατάλογο των `αντικειμένων` μας, θα διαπιστώσουμε ότι τα περισσότερα αντικείμενά μας έχουν εξαφανιστεί και εμφανίστηκε ένα νέο ζευγάρι αρχείων:
104104

105105
[source,console]
106106
----
@@ -112,20 +112,19 @@ $ find .git/objects -type f
112112
.git/objects/pack/pack-978e03944f5c581011e6998cd0e9e30000905586.pack
113113
----
114114

115-
Τα αντικείμενα που παραμένουν είναι τα blob στα οποία δεν δείχνει καμία υποβολή —στην περίπτωση αυτή, τα ``what up, doc'' και ``test content'' που δημιουργήσαμε νωρίτερα.
116-
Επειδή δεν τα προσθέσαμε ποτέ σε καμία υποβολή, θεωρούνται ότι εκκρεμή και δεν έχουν συσκευαστεί στο νέο μας πακέτο.
115+
Τα αντικείμενα που παραμένουν είναι τα blobs στα οποία δεν δείχνει καμία υποβολή — στην περίπτωση αυτή, τα παραδείγματα blobs "`what is up, doc?`" και "`test content`" που δημιουργήσαμε νωρίτερα.
116+
Επειδή δεν τα προσθέσαμε ποτέ σε καμία υποβολή, θεωρούνται ότι είναι εκκρεμή και δεν έχουν συσκευαστεί στο νέο μας πακέτο.
117117

118118
Τα άλλα αρχεία είναι το νέο πακέτο και ένα ευρετήριο.
119119
Το πακέτο είναι μόνον ένα αρχείο που περιέχει τα περιεχόμενα όλων των αντικειμένων που έχουν αφαιρεθεί από το σύστημα αρχείων μας.
120-
Το ευρετήριο είναι ένα αρχείο που περιέχει τις θέσεις σε byte των αντικειμένων σε αυτό το packfile ώστε η αναζήτηση ενός συγκεκριμένου αντικειμένου να γίνεται γρήγορα.
121-
122-
Το ωραίο είναι ότι αν και τα αντικείμενα στον δίσκο προτού εκτελέσουμε την `gc` ήταν συνολικά περίπου 22Κ σε μέγεθος, το νέο πάκο είναι μόνο 7K.
123-
Έχουμε μειώσει τη χρήση του δίσκου κατά ⅔ επειδή πακετάραμε τα αντικείμενά μας.
120+
Το ευρετήριο είναι ένα αρχείο που περιέχει τις μετατοπίσεις (offsets) των αντικειμένων σε αυτό το packfile ώστε η αναζήτηση ενός συγκεκριμένου αντικειμένου να γίνεται γρήγορα.
121+
Το ωραίο είναι ότι αν και τα αντικείμενα στον δίσκο προτού εκτελέσουμε την `gc` ήταν συνολικά περίπου 15K σε μέγεθος, το νέο packfile είναι μόνο 7K.
122+
Έχουμε μειώσει τη χρήση του δίσκου κατά το ήμισυ επειδή πακετάραμε τα αντικείμενά μας.
124123

125124
Πώς το κάνει αυτό το Git;
126-
Όταν το Git πακετάρει αντικείμενα, ψάχνει για αρχεία που έχουν παρόμοιο όνομα και μέγεθος και αποθηκεύει μόνο τις διαφορές (deltas) από μια έκδοση του αρχείου στην επόμενη.
125+
Όταν το Git πακετάρει αντικείμενα, ψάχνει για αρχεία που έχουν παρόμοιο όνομα και μέγεθος, και αποθηκεύει μόνο τις διαφορές (deltas) από μια έκδοση του αρχείου στην επόμενη.
127126
Μπορούμε να δούμε μέσα στο πακέτο και να δούμε τι έκανε το Git για να εξοικονομήσει χώρο.
128-
Η εντολή `git verify-pack` μας δίνει τη δυνατότητα να δούμε τι ήταν συσκευάστηκε στο πακέτο:
127+
Η εντολή `git verify-pack` μας δίνει τη δυνατότητα να δούμε τι συσκευάστηκε στο πακέτο:
129128

130129
[source,console]
131130
----
@@ -156,10 +155,9 @@ chain length = 1: 3 objects
156155
.git/objects/pack/pack-978e03944f5c581011e6998cd0e9e30000905586.pack: ok
157156
----
158157

159-
Εδώ, το blob `033b4`, το οποίο, ας θυμηθούμε, ήταν η πρώτη έκδοση του αρχείου repo.rb γίνεται αναφορά στο blob `b042a`, που ήταν η δεύτερη έκδοση του αρχείου.
158+
Εδώ, το blob `033b4`, το οποίο, ας θυμηθούμε, ήταν η πρώτη έκδοση του αρχείου `repo.rb` γίνεται αναφορά στο blob `b042a`, που ήταν η δεύτερη έκδοση του αρχείου.
160159
Η τρίτη στήλη στην έξοδο είναι το μέγεθος του αντικειμένου στο πακέτο, ώστε να μπορούμε να δούμε ότι το `b042a` καταλαμβάνει 22Κ του αρχείου, αλλά το `033b4` καταλαμβάνει μόνο 9 byte.
161-
Αυτό που είναι επίσης ενδιαφέρον είναι ότι η δεύτερη έκδοση του αρχείου είναι αυτή που είναι αποθηκευμένη άθικτη, ενώ η αρχική έκδοση αποθηκεύεται ως δέλτα —αυτό γίνεται επειδή πιθανότατα θα χρειαστούμε ταχύτερη πρόσβαση στην πιο πρόσφατη έκδοση του αρχείου .
160+
Αυτό που είναι επίσης ενδιαφέρον είναι ότι η δεύτερη έκδοση του αρχείου αποθηκεύεται άθικτη, ενώ η αρχική έκδοση αποθηκεύεται ως δέλτα — αυτό γίνεται επειδή πιθανότατα θα χρειαστούμε ταχύτερη πρόσβαση στην πιο πρόσφατη έκδοση του αρχείου.
162161

163162
Αυτό που είναι πραγματικά ωραίο είναι ότι μπορεί να ανασυσκευαστεί ανά πάσα στιγμή.
164-
Το Git ξαναπακετάρει κατά καιρούς τη βάση δεδομένων μας αυτόματα, προσπαθώντας πάντα να εξοικονομήσει περισσότερο χώρο, αλλά μπορούμε επίσης να επανασυσκευάσουμε μη-αυτόματα οποιαδήποτε στιγμή τρέχοντας `git gc`.
165-
163+
Το Git ξαναπακετάρει κατά καιρούς τη βάση δεδομένων μας αυτόματα, προσπαθώντας πάντα να εξοικονομήσει περισσότερο χώρο, αλλά μπορούμε επίσης να επανασυσκευάσουμε μη-αυτόματα οποιαδήποτε στιγμή τρέχοντας `git gc` χειροκίνητα.

0 commit comments

Comments
 (0)