You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: book/10-git-internals/sections/packfiles.asc
+29-31Lines changed: 29 additions & 31 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,22 +1,21 @@
1
1
=== Πακετάρισμα αρχείων
2
2
3
-
Ας επιστρέψουμε στη βάση δεδομένων των αντικειμένων για το δοκιμαστικό μας αποθετήριο Git.
4
-
Σε αυτό το σημείο, έχουμε 11 αντικείμενα —4 blobs, 3 δέντρα, 3 υποβολές και 1 ετικέτα:
3
+
Αν κάναμε όλα τα βήματα από το παράδειγμα της προηγούμενης ενότητας, τώρα θα πρέπει να έχουμε το δοκιμαστικό μας αποθετήριο Git με 11 αντικείμενα — τέσσερα blobs, τρία δέντρα, τρία υποβολές και μία ετικέτα:
Έχουμε δύο σχεδόν ταυτόσημα αντικείμενα 22K στον δίσκο μας.
84
+
Έχουμε δύο σχεδόν ταυτόσημα αντικείμενα 22K στον δίσκο μας (που το καθένα είναι συμπιεσμένο περίπου 7K).
85
85
Δεν θα ήταν ωραίο αν το Git μπορούσε να αποθηκεύσει ένα από αυτά πλήρως, αλλά το δεύτερο αντικείμενο μόνο ως το δέλτα μεταξύ αυτού και του πρώτου;
86
86
87
87
Ε, λοιπόν, μπορεί.
88
-
Η αρχική μορφή στην οποία το Git αποθηκεύει αντικείμενα στον δίσκο ονομάζεται _χαλαρή_ μορφή αντικειμένου.
89
-
Εντούτοις, περιστασιακά το Git ``πακετάρει'' αρκετά από αυτά τα αντικείμενα σε ένα μόνο δυαδικό αρχείο που ονομάζεται πακέτο (packfile) για να εξοικονομήσει χώρο και να είναι πιο αποδοτικό.
90
-
Το Git το κάνει αυτό εάν έχουμε πολλά χαλαρά αντικείμενα γύρω μας, αν εκτελέσουμε χειροκίνητα την εντολή `git gc` ή αν ωθήσουμε σε έναν απομακρυσμένο διακομιστή.
88
+
Η αρχική μορφή στην οποία το Git αποθηκεύει αντικείμενα στον δίσκο ονομάζεται "`χαλαρή`" ("`loose`") μορφή αντικειμένου.
89
+
Εντούτοις, περιστασιακά το Git πακετάρει αρκετά από αυτά τα αντικείμενα σε ένα μόνο δυαδικό αρχείο που ονομάζεται "`πακέτο`" ("`packfile`") για να εξοικονομήσει χώρο και να είναι πιο αποδοτικό.
90
+
Το Git το κάνει αυτό εάν έχουμε πολλά χαλαρά αντικείμενα γενικώς, αν εκτελέσουμε χειροκίνητα την εντολή `git gc` ή αν ωθήσουμε σε έναν απομακρυσμένο διακομιστή.
91
91
Για να δούμε τι συμβαίνει, μπορούμε να ζητήσουμε από το Git να συσκευάσει τα αντικείμενα καλώντας την εντολή `git gc`:
Αν κοιτάξουμε στον κατάλογο των αντικειμένων μας, θα διαπιστώσουμε ότι τα περισσότερα αντικείμενά μας έχουν εξαφανιστεί και εμφανίστηκε ένα νέο ζευγάρι αρχείων:
103
+
Αν κοιτάξουμε στον κατάλογο των `αντικειμένων` μας, θα διαπιστώσουμε ότι τα περισσότερα αντικείμενά μας έχουν εξαφανιστεί και εμφανίστηκε ένα νέο ζευγάρι αρχείων:
Τα αντικείμενα που παραμένουν είναι τα blob στα οποία δεν δείχνει καμία υποβολή —στην περίπτωση αυτή, τα ``what up, doc'' και ``test content'' που δημιουργήσαμε νωρίτερα.
116
-
Επειδή δεν τα προσθέσαμε ποτέ σε καμία υποβολή, θεωρούνται ότι εκκρεμή και δεν έχουν συσκευαστεί στο νέο μας πακέτο.
115
+
Τα αντικείμενα που παραμένουν είναι τα blobs στα οποία δεν δείχνει καμία υποβολή —στην περίπτωση αυτή, τα παραδείγματα blobs "`what is up, doc?`" και "`test content`" που δημιουργήσαμε νωρίτερα.
116
+
Επειδή δεν τα προσθέσαμε ποτέ σε καμία υποβολή, θεωρούνται ότι είναι εκκρεμή και δεν έχουν συσκευαστεί στο νέο μας πακέτο.
117
117
118
118
Τα άλλα αρχεία είναι το νέο πακέτο και ένα ευρετήριο.
119
119
Το πακέτο είναι μόνον ένα αρχείο που περιέχει τα περιεχόμενα όλων των αντικειμένων που έχουν αφαιρεθεί από το σύστημα αρχείων μας.
120
-
Το ευρετήριο είναι ένα αρχείο που περιέχει τις θέσεις σε byte των αντικειμένων σε αυτό το packfile ώστε η αναζήτηση ενός συγκεκριμένου αντικειμένου να γίνεται γρήγορα.
121
-
122
-
Το ωραίο είναι ότι αν και τα αντικείμενα στον δίσκο προτού εκτελέσουμε την `gc` ήταν συνολικά περίπου 22Κ σε μέγεθος, το νέο πάκο είναι μόνο 7K.
123
-
Έχουμε μειώσει τη χρήση του δίσκου κατά ⅔ επειδή πακετάραμε τα αντικείμενά μας.
120
+
Το ευρετήριο είναι ένα αρχείο που περιέχει τις μετατοπίσεις (offsets) των αντικειμένων σε αυτό το packfile ώστε η αναζήτηση ενός συγκεκριμένου αντικειμένου να γίνεται γρήγορα.
121
+
Το ωραίο είναι ότι αν και τα αντικείμενα στον δίσκο προτού εκτελέσουμε την `gc` ήταν συνολικά περίπου 15K σε μέγεθος, το νέο packfile είναι μόνο 7K.
122
+
Έχουμε μειώσει τη χρήση του δίσκου κατά το ήμισυ επειδή πακετάραμε τα αντικείμενά μας.
124
123
125
124
Πώς το κάνει αυτό το Git;
126
-
Όταν το Git πακετάρει αντικείμενα, ψάχνει για αρχεία που έχουν παρόμοιο όνομα και μέγεθος και αποθηκεύει μόνο τις διαφορές (deltas) από μια έκδοση του αρχείου στην επόμενη.
125
+
Όταν το Git πακετάρει αντικείμενα, ψάχνει για αρχεία που έχουν παρόμοιο όνομα και μέγεθος, και αποθηκεύει μόνο τις διαφορές (deltas) από μια έκδοση του αρχείου στην επόμενη.
127
126
Μπορούμε να δούμε μέσα στο πακέτο και να δούμε τι έκανε το Git για να εξοικονομήσει χώρο.
128
-
Η εντολή `git verify-pack` μας δίνει τη δυνατότητα να δούμε τι ήταν συσκευάστηκε στο πακέτο:
127
+
Η εντολή `git verify-pack` μας δίνει τη δυνατότητα να δούμε τι συσκευάστηκε στο πακέτο:
129
128
130
129
[source,console]
131
130
----
@@ -156,10 +155,9 @@ chain length = 1: 3 objects
156
155
.git/objects/pack/pack-978e03944f5c581011e6998cd0e9e30000905586.pack: ok
157
156
----
158
157
159
-
Εδώ, το blob `033b4`, το οποίο, ας θυμηθούμε, ήταν η πρώτη έκδοση του αρχείου repo.rb γίνεται αναφορά στο blob `b042a`, που ήταν η δεύτερη έκδοση του αρχείου.
158
+
Εδώ, το blob `033b4`, το οποίο, ας θυμηθούμε, ήταν η πρώτη έκδοση του αρχείου `repo.rb` γίνεται αναφορά στο blob `b042a`, που ήταν η δεύτερη έκδοση του αρχείου.
160
159
Η τρίτη στήλη στην έξοδο είναι το μέγεθος του αντικειμένου στο πακέτο, ώστε να μπορούμε να δούμε ότι το `b042a` καταλαμβάνει 22Κ του αρχείου, αλλά το `033b4` καταλαμβάνει μόνο 9 byte.
161
-
Αυτό που είναι επίσης ενδιαφέρον είναι ότι η δεύτερη έκδοση του αρχείου είναι αυτή που είναι αποθηκευμένη άθικτη, ενώ η αρχική έκδοση αποθηκεύεται ως δέλτα —αυτό γίνεται επειδή πιθανότατα θα χρειαστούμε ταχύτερη πρόσβαση στην πιο πρόσφατη έκδοση του αρχείου.
160
+
Αυτό που είναι επίσης ενδιαφέρον είναι ότι η δεύτερη έκδοση του αρχείου αποθηκεύεται άθικτη, ενώ η αρχική έκδοση αποθηκεύεται ως δέλτα —αυτό γίνεται επειδή πιθανότατα θα χρειαστούμε ταχύτερη πρόσβαση στην πιο πρόσφατη έκδοση του αρχείου.
162
161
163
162
Αυτό που είναι πραγματικά ωραίο είναι ότι μπορεί να ανασυσκευαστεί ανά πάσα στιγμή.
164
-
Το Git ξαναπακετάρει κατά καιρούς τη βάση δεδομένων μας αυτόματα, προσπαθώντας πάντα να εξοικονομήσει περισσότερο χώρο, αλλά μπορούμε επίσης να επανασυσκευάσουμε μη-αυτόματα οποιαδήποτε στιγμή τρέχοντας `git gc`.
165
-
163
+
Το Git ξαναπακετάρει κατά καιρούς τη βάση δεδομένων μας αυτόματα, προσπαθώντας πάντα να εξοικονομήσει περισσότερο χώρο, αλλά μπορούμε επίσης να επανασυσκευάσουμε μη-αυτόματα οποιαδήποτε στιγμή τρέχοντας `git gc` χειροκίνητα.
0 commit comments