Git
Chapters ▾ 2nd Edition

10.1 Εσωτερική λειτουργία του Git - Διοχετεύσεις και πορσελάνες

Ενδεχομένως το κεφάλαιο αυτό το διαβάζει κανείς αφού έχει διαβάσει το υπόλοιπο βιβλίο ή ίσως χρειάστηκε να ανατρέξει σε αυτό όταν διάβαζε κάποιο προηγούμενο κεφάλαιο --σε κάθε περίπτωση, σε αυτό το κεφάλαιο θα δούμε την εσωτερική λειτουργία και υλοποίηση του Git. Θεωρούμε ότι η εκμάθηση αυτών των πληροφοριών είναι θεμελιώδως σημαντική για την κατανόηση του πόσο χρήσιμο και ισχυρό είναι το Git, κάποιοι άλλοι όμως υποστήριξαν ότι μπορεί να δημιουργήσει σύγχυση και είναι άσκοπα περίπλοκο για αρχάριους. Γι' αυτόν τον λόγο, έχουμε κάνει αυτήν τη συζήτηση το τελευταίο κεφάλαιο του βιβλίου έτσι ώστε να μπορούμε να το διαβάσουμε νωρίς ή αργότερα στη διαδικασία της μάθησής μας. Αυτό ας το αποφασίσει ο καθένας για τον εαυτό του.

Μια που είμαστε εδώ, ας αρχίσουμε. Καταρχάς, αν δεν είναι ήδη ξεκάθαρο, το Git είναι βασικά ένα σύστημα αρχείων που απευθύνεται στο περιεχόμενο με ένα VCS γραμμέν από πάνω ως διεπαφή χρήστη. Θα μάθουμε περισσότερα για το τι σημαίνει αυτό σε λίγο.

Στις πρώτες μέρες του Git (κυρίως πριν την έκδοση 1.5), η διεπαφή χρήστη ήταν πολύ πιο περίπλοκη επειδή δινόταν έμφαση στο σύστημα αρχείων μάλλον παρά ένα καλογυαλισμένο VCS. Τα τελευταία χρόνια, η διεπαφή χρήστη έχει βελτιωθεί τόσο, ώστε το Git είναι καθαρό και εύκολο στη χρήση, όπως οποιοδήποτε άλλο σύστημα· αλλά συχνά, το στερεότυπο για την παλιά διεπαφή χρήστη, ότι ήταν πολύπλοκη και δύσκολο να τη μάθει κανείς, αιωρείται στην ατμόσφαιρα.

Το σύστημα αρχείων που είναι απευθύνεται στο περιεχόμενο είναι εκπληκτικά όμορφο, επομένως θα το καλύψουμε πρώτο σε αυτό το κεφάλαιο· μετά θα μάθουμε για τους μηχανισμούς μεταφοράς και εργασίες διαχείρισης του αποθετηρίου, που θα χρειαστεί σε κάποια στιγμή να χρησιμοποιήσουμε.

Διοχετεύσεις και πορσελάνες

Αυτό το βιβλίο καλύπτει τον τρόπο χρήσης του Git με καμιά τριανταριά ρήματα, όπως checkout, branch, remote κ.ο.κ. Αλλά επειδή το Git ήταν αρχικά ένα εργαλείο για VCS αντί για ένα πλήρως φιλικό-προς-τον-χρήστη VCS, έχει μερικά ρήματα που κάνουν εργασίες χαμηλού επιπέδου και είχαν σχεδιαστεί για να είναι συνδεδεμένες μεταξύ τους ακολουθώντας το στυλ του UNIX ή να καλούνται από script. Σε αυτές τις εντολές αναφερόμαστε γενικά ως εντολές “διοχέτευσης” και οι πιο φιλικές προς το χρήστη εντολές ονομάζονται εντολές 'πορσελάνης'.

Τα πρώτα εννέα κεφάλαια του βιβλίου ασχολούνται σχεδόν αποκλειστικά με εντολές πορσελάνης. Αλλά σε αυτό το κεφάλαιο, θα ασχοληθούμε κυρίως με τις χαμηλότερου επιπέδου εντολές διοχέτευσης, επειδή μας δίνουν πρόσβαση στις εσωτερικές λειτουργίες του Git και βοηθούν να δείξουμε πώς και γιατί το Git κάνει ό,τι κάνει. Πολλές από αυτές τις εντολές δεν προορίζονται να χρησιμοποιηθούν στη γραμμή εντολών, αλλά να χρησιμοποιηθούν ως δομικά στοιχεία για νέα εργαλεία και εξατομικευμένα script.

Όταν εκτελούμε την git init σε νέο ή υπάρχοντα κατάλογο, το Git δημιουργεί τον κατάλογο .git, ο οποίος είναι ο τόπος όπου βρίσκονται σχεδόν όλα όσα αποθηκεύει και χειρίζεται το Git. Αν θέλουμε να δημιουργήσουμε αντίγραφα ασφαλείας ή να κλωνοποιήσουμε το αποθετήριο, η αντιγραφή αυτού του καταλόγου θα μας δώσει σχεδόν ό,τι χρειαζόμαστε. Όλο αυτό το κεφάλαιο ασχολείται βασικά με ό,τι κατοικεί σε αυτόν τον κατάλογο. Ο κατάλογος αυτός έχει περίπου την εξής μορφή:

$ ls -F1
HEAD
config*
description
hooks/
info/
objects/
refs/

Ενδέχεται να δούμε και κάποια άλλα αρχεία, αλλά αυτό είναι ένα αποθετήριο που μόλις δημιουργήθηκε με την git init —αυτά είναι τα μόνα που βλέπουμε εκ προεπιλογής. Το αρχείο description χρησιμοποιείται μόνο από το πρόγραμμα GitWeb, οπότε δεν θα ασχοληθούμε με αυτό. Το αρχείο config περιέχει τις επιλογές διαμόρφωσης που σχετίζονται με το συγκεκριμένο έργο και ο κατάλογος info διατηρεί ένα καθολικό (global) αρχείο αποκλεισμού , το .gitignore, για μοτίβα που δεν θέλουμε να παρακολουθούμε. Ο κατάλογος hooks περιέχει τα script-άγκιστρα τόσο από την πλευρά του πελάτη όσο και από την πλευρά του διακομιστή, τα οποία αναλύονται λεπτομερώς στην ενότητα Τα άγκιστρα του Git.

Αυτό αφήνει τέσσερα σημαντικά στοιχεία: τα αρχεία HEAD και index (το τελευταίο δεν έχει δημιουργηθεί ακόμα) και τους καταλόγους objects και refs. Αυτά είναι τα κεντρικά μέρη του Git. Ο κατάλογος objects αποθηκεύει όλο το περιεχόμενο που χρειάζεται η βάση δεδομένων μας, ο κατάλογος refs αποθηκεύει δείκτες σε αντικείμενα υποβολής σε εκείνα τα δεδομένα (κλάδοι), το αρχείο HEAD δείχνει στον κλάδο στον οποίο μόλις έχουμε μεταβεί και το αρχείο index είναι το σημείο όπου το Git αποθηκεύει τις πληροφορίες του σταδίου καταχώρισης. Θα εξετάσουμε τώρα καθένα από αυτά τα τμήματα λεπτομερώς για να δούμε πώς λειτουργεί το Git.