-
1. Ξεκινώντας με το Git
-
2. Τα θεμελιώδη στοιχεία του Git
-
3. Διακλαδώσεις στο Git
-
4. Το Git στον διακομιστή
- 4.1 Τα πρωτόκολλα
- 4.2 Εγκατάσταση του Git σε διακομιστή
- 4.3 Δημιουργία δημόσιου κλειδιού SSH
- 4.4 Στήσιμο του διακομιστή
- 4.5 Δαίμονες του Git
- 4.6 Έξυπνο HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Επιλογές φιλοξενίας από τρίτους
- 4.10 Ανακεφαλαίωση
-
5. Κατανεμημένο Git
-
6. GitHub
-
7. Εργαλεία του Git
- 7.1 Επιλογή αναθεώρησης
- 7.2 Διαδραστική εργασία με το στάδιο καταχώρισης
- 7.3 Αποθέματα και Καθαρισμός
- 7.4 Υπογραφή της δουλειάς μας
- 7.5 Αναζήτηση
- 7.6 Η ιστορία ξαναγράφεται
- 7.7 Απομυθοποίηση της reset
- 7.8 Προχωρημένη Συγχώνευση
- 7.9 Rerere
- 7.10 Αποσφαλμάτωση με το Git
- 7.11 Υπομονάδες
- 7.12 Δεμάτιασμα δεδομένων
- 7.13 Replace
- 7.14 Αποθήκευση διαπιστευτηρίων
- 7.15 Ανακεφαλαίωση
-
8. Εξατομίκευση του Git
-
9. Το Git και άλλα συστήματα
- 9.1 Το Git ως πελάτης
- 9.2 Μετανάστευση στο Git
- 9.3 Ανακεφαλαίωση
-
10. Εσωτερική λειτουργία του Git
- 10.1 Διοχετεύσεις και πορσελάνες
- 10.2 Αντικείμενα του Git
- 10.3 Αναφορές του Git
- 10.4 Πακετάρισμα αρχείων
- 10.5 Τα refspec
- 10.6 Πρωτόκολλα μεταφοράς
- 10.7 Διατήρηση και ανάκτηση δεδομένων
- 10.8 Μεταβλητές περιβάλλοντος
- 10.9 Ανακεφαλαίωση
-
A1. Appendix A: Το Git σε άλλα περιβάλλοντα
- A1.1 Γραφικές διεπαφές
- A1.2 Το Git στο Visual Studio
- A1.3 Git στο Visual Studio Code
- A1.4 Git στο IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git στο Sublime Text
- A1.6 Το Git στο Bash
- A1.7 Το Git στο Zsh
- A1.8 Το Git στο Powershell
- A1.9 Ανακεφαλαίωση
-
A2. Appendix B: Ενσωμάτωση του Git στις εφαρμογές μας
- A2.1 Γραμμή εντολών Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Appendix C: Εντολές Git
- A3.1 Ρύθμιση και διαμόρφωση
- A3.2 Λήψη και δημιουργία έργων
- A3.3 Βασική λήψη στιγμιοτύπων
- A3.4 Διακλάδωση και συγχώνευση
- A3.5 Κοινή χρήση και ενημέρωση έργων
- A3.6 Επιθεώρηση και σύγκριση
- A3.7 Αποσφαλμάτωση
- A3.8 Επιθέματα
- A3.9 Ηλεκτρονικό ταχυδρομείο
- A3.10 Εξωτερικά Συστήματα
- A3.11 Διοίκηση
- A3.12 Εντολές διοχέτευσης
4.1 Το Git στον διακομιστή - Τα πρωτόκολλα
Σε αυτό το σημείο, πρέπει να είστε σε θέση να κάνετε τις περισσότερες από τις καθημερινές εργασίες για τις οποίες θα χρησιμοποιείτε το Git. Ωστόσο, προκειμένου να κάνετε οποιαδήποτε συνεργασία στο Git, θα χρειαστείτε και ένα απομακρυσμένο αποθετήριο Git. Παρότι θεωρητικά μπορείτε να ωθείτε τις αλλαγές, και να τραβάτε αλλαγές από τα ατομικά αποθετήρια των συνεργατών σας, κάτι τέτοιο δεν συνιστάται διότι είναι εύκολο να μπουρδουκλώσετε τα αρχεία τους, αν δεν είστε πολύ προσεκτικοί. Επιπλέον, θέλετε οι συνεργάτες σας να μπορούν να έχουν πρόσβαση στο αποθετήριο ακόμη και αν ο υπολογιστής σας είναι εκτός δικτύου --το να έχετε ένα πιο αξιόπιστο, κοινό αποθετήριο είναι συχνά χρήσιμο. Επομένως, η προτιμώμενη μέθοδος συνεργασίας είναι η δημιουργία ενός ενδιάμεσου αποθετηρίου στο οποίο έχετε πρόσβαση και οι δύο και μπορείτε να ωθείτε σε ή να τραβάτε από αυτό.
Η λειτουργία ενός διακομιστή Git είναι αρκετά απλή. Καταρχάς, πρέπει να επιλέξετε με ποια πρωτόκολλα θέλετε να επικοινωνεί ο διακομιστής σας. Η πρώτη ενότητα αυτού του κεφαλαίου θα καλύψει τα διαθέσιμα πρωτόκολλα και τα πλεονεκτήματα και μειονεκτήματά τους. Οι επόμενες ενότητες θα εξηγήσουν κάποιες τυπικές εγκαταστάσεις χρησιμοποιώντας αυτά τα πρωτόκολλα και πώς μπορείτε να λειτουργείτε τον διακομιστή σας με βάση αυτά. Τέλος, θα εξετάσετε μερικές επιλογές φιλοξενίας, αν δεν σας ενοχλεί να φιλοξενείται ο κώδικάς σας σε κάποιον τρίτο διακομιστή και δεν θέλετε να υποστείτε την ταλαιπωρία της εγκατάστασης και συντήρησης του δικού σας διακομιστή.
Εάν δεν θέλετε χρησιμοποιείτε τον δικό σας διακομιστή, μπορείτε να μεταβείτε στην τελευταία ενότητα του κεφαλαίου για να δείτε μερικές επιλογές για τη δημιουργία ενός φιλοξενούμενου λογαριασμού και στη συνέχεια να προχωρήσετε στο επόμενο κεφάλαιο όπου θα συζητήσετε τα υπέρ και τα κατά της εργασίας σε ένα κατανεμημένο περιβάλλον ελέγχου.
Ένα απομακρυσμένο αποθετήριο είναι γενικά ένα γυμνό αποθετήριο — ένα αποθετήριο Git που δεν έχει κατάλογο εργασίας.
Επειδή το αποθετήριο χρησιμοποιείται μόνο ως σημείο συνεργασίας, δεν έχει κανένα νόημα να έχει κάποιο στιγμιότυπο στον δίσκο· αποτελείται μόνο από τα δεδομένα του Git.
Πιο απλά, ένα γυμνό αποθετήριο είναι το περιεχόμενο του καταλόγου .git του έργου σας και τίποτα άλλο.
Τα πρωτόκολλα
Το Git μπορεί να χρησιμοποιήσει τέσσερα διαφορετικά πρωτόκολλα για τη μεταφορά δεδομένων: Local, HTTP, Secure Shell (SSH) και Git. Θα συζητήσουμε τι είναι αυτά τα πρωτόκολλα και σε ποιες βασικές περιστάσεις θέλουμε (ή δεν θέλουμε) να τα χρησιμοποιήσουμε.
Το τοπικό πρωτόκολλο
Το πιο βασικό είναι το τοπικό πρωτόκολλο, στο οποίο το απομακρυσμένο αποθετήριο βρίσκεται σε άλλο κατάλογο στον δίσκο. Αυτό χρησιμοποιείται συχνά εάν όλοι στην ομάδα μας έχουν πρόσβαση σε ένα κοινό σύστημα αρχείων (filesystem), όπως NFS mount ή στη σχετικά σπάνια περίπτωση που όλοι οι χρήστες συνδέονται στον ίδιο υπολογιστή. Η τελευταία περίπτωση είναι λιγότερο ιδανική, διότι όλα τα στιγμιότυπα κώδικα του αποθετηρίου θα βρίσκονται στον ίδιο υπολογιστή, καθιστώντας πολύ πιο πιθανή μια καταστροφική απώλεια.
Εάν διαθέτουμε ένα κοινόχρηστο σύστημα αρχείων, μπορούμε να κλωνοποιήσουμε, να ωθήσουμε σε και να έλξουμε από ένα αποθετήριο που βασίζεται σε τοπικά αρχεία. Για να κλωνοποιήσουμε ένα αποθετήριο όπως αυτό ή για να το προσθέσουμε ως απομακρυσμένο σε ένα υπάρχον έργο, χρησιμοποιούμε τη διαδρομή (path) του αποθετηρίου ως διεύθυνση URL. Για παράδειγμα, για να κλωνοποιήσουμε ένα τοπικό αποθετήριο, μπορούμε να εκτελέσουμε κάτι σαν:
$ git clone /srv/git/project.git
Ή κάτι σαν:
$ git clone file:///srv/git/project.git
Το Git λειτουργεί ελαφρώς διαφορετικά αν καθορίσουμε ρητά το file:// στην αρχή της διεύθυνσης URL.
Αν καθορίσουμε μόνο τη διαδρομή, το Git προσπαθεί να χρησιμοποιήσει hardlinks ή να αντιγράψει απευθείας τα αρχεία που χρειάζονται.
Εάν προσθέσουμε το file://, το Git ενεργοποιεί τις διαδικασίες που συνήθως χρησιμοποιεί για τη μεταφορά δεδομένων μέσω δικτύου, μία μέθοδο μεταφοράς των δεδομένων γενικά πολύ λιγότερο αποτελεσματική.
Ο βασικός λόγος που θα θέλαμε να χρησιμοποιήσουμε το file:// είναι η περίπτωση κατά την οποία θέλουμε ένα καθαρό αντίγραφο του αποθετηρίου με εξωτερικές αναφορές ή αντικείμενα που απομένουν — συνήθως μετά από εισαγωγή από ένα άλλο σύστημα ελέγχου εκδόσεων ή κάτι παρόμοιο (βλ. Εσωτερική λειτουργία του Git για σχετικές εργασίες συντήρησης).
Στο παρακάτω παράδειγμα θα χρησιμοποιήσουμε τη διαδρομή χωρίς το file:// επειδή αυτό είναι σχεδόν πάντα γρηγορότερο.
Για να προσθέσουμε ένα τοπικό αποθετήριο σε ένα υπάρχον έργο Git, μπορούμε να εκτελέσουμε κάτι σαν:
$ git remote add local_proj /srv/git/project.git
Στη συνέχεια, μπορούμε να ωθήσουμε και να έλξουμε από αυτό το απομακρυσμένο αποθετήριο, με όνομα local_proj, σαν να το κάναμε μέσα από ένα δίκτυο.
Τα υπέρ
Τα πλεονεκτήματα των αποθετηρίων που βασίζονται σε αρχεία είναι ότι είναι απλά και χρησιμοποιούν τα υπάρχοντα δικαιώματα σε αρχεία και πρόσβαση στο δίκτυο. Εάν έχουμε ήδη ένα κοινό σύστημα αρχείων στο οποίο έχει πρόσβαση ολόκληρη η ομάδα μας, η εγκατάσταση ενός αποθετηρίου είναι πολύ εύκολη. Μπορούμε να κολλήσουμε ένα γυμνό (χωρίς αρχεία) αντίγραφο του αποθετηρίου κάπου όπου ο καθένας έχει πρόσβαση και να ορίσουμε τα δικαιώματα ανάγνωσης/εγγραφής όπως θα κάναμε για οποιονδήποτε άλλο κοινόχρηστο κατάλογο. Θα συζητήσουμε πώς μπορούμε να κάνουμε export ένα αντίγραφο γυμνού αποθετηρίου για αυτόν τον σκοπό αυτό στο Εγκατάσταση του Git σε διακομιστή.
Αυτή είναι επίσης μια καλή επιλογή για γρήγορη λήψη της εργασίας από το αποθετήριο εργασίας κάποιου άλλου.
Εάν εμείς και μία συνεργάτιδά μας εργαζόμαστε στο ίδιο έργο και η συνεργάτιδά μας θέλει να ελέγξουμε τη δουλειά της, η εκτέλεση μιας εντολής όπως git pull /home/john/project είναι συχνά ευκολότερη από ό,τι η συνεργάτιδά μας να ωθήσει σε έναν απομακρυσμένο διακομιστή και εμείς να ανακτήσουμε από αυτόν.
Τα κατά
Τα μειονεκτήματα αυτής της μεθόδου είναι ότι η κοινή πρόσβαση είναι γενικά πιο δύσκολη στη ρύθμιση και πρόσβαση από πολλαπλές τοποθεσίες από ότι η βασική πρόσβαση στο δίκτυο. Αν θέλουμε να ωθήσουμε από τον φορητό μας υπολογιστή όταν είμαστε στο σπίτι, θα πρέπει να κάνουμε mount τον απομακρυσμένο δίσκο, κάτι που ενδεχομένως είναι δύσκολο και αργό σε σύγκριση με την πρόσβαση που βασίζεται στο δίκτυο.
Είναι σημαντικό να αναφερθεί ότι αυτή δεν είναι απαραίτητα η γρηγορότερη επιλογή, εφόσον χρησιμοποιούμε κάποιου είδους κοινό mount. Ένα τοπικό αποθετήριο είναι γρήγορο μόνον εφόσον έχουμε γρήγορη πρόσβαση στα δεδομένα. Ένα αποθετήριο σε NFS είναι συχνά πιο αργό από ένα αποθετήριο με πρόσβαση SSH στον ίδιο διακομιστή, κάτι που επιτρέπει στο Git να τρέχει σε τοπικούς σε κάθε σύστημα.
Τέλος, το πρωτόκολλο αυτό δεν προστατεύει το αποθετήριο από τυχαίες αστοχίες. Όλοι οι χρήστες έχουν πλήρη πρόσβαση στο κέλυφος στον “απομακρυσμένο” κατάλογο και τίποτα δεν τους εμποδίζει να αλλάξουν ή να αφαιρέσουν εσωτερικά αρχεία του Git και να καταστρέψουν το αποθετήριο.
Πρωτόκολλα HTTP
Το Git μπορεί να επικοινωνήσει μέσω HTTP με δύο διαφορετικούς τρόπους. Πριν από το Git 1.6.6 υπήρχε μόνον ένας τρόπος, που ήταν πολύ απλοϊκός και γενικά μόνο-για-ανάγνωση. Στην έκδοση 1.6.6 εισήχθη ένα νέο, πιο έξυπνο πρωτόκολλο το οποίο περιλάμβανει τη δυνατότητα του Git να διαπραγματεύεται έξυπνα τη μεταφορά δεδομένων με τρόπο παρόμοιο όπως μέσω SSH. Τα τελευταία χρόνια αυτό το νέο πρωτόκολλο HTTP έχει γίνει πολύ δημοφιλές, διότι είναι απλούστερο για τους χρήστες και πιο έξυπνο όσον αφορά στον τρόπο επικοινωνίας. Η νεότερη έκδοση αναφέρεται συχνά ως Έξυπνο HTTP και ο παλαιότερος τρόπος ως Χαζό HTTP. Θα καλύψουμε πρώτα το πιο πρόσφατο Εξυπνο HTTP.
Έξυπνο HTTP
Το Εξυπνο HTTP έχει παρόμοια λειτουργία με τα πρωτόκολλα SSH ή Git, αλλά τρέχει στις θύρες που χρησιμοποιουνται τυπικά για HTTPS και μπορεί να χρησιμοποιήσει διάφορους μηχανισμούς ταυτοποίησης HTTP, κάτι που σημαίνει ότι είναι συχνά πιο εύχρηστο για τους χρήστες από ό,τι είναι για παράδειγμα το SSH, δεδομένου ότι επιτρέπει την ταυτοποίηση με όνομα χρήστη/κωδικό πρόσβασης, αντί για κλειδιά SSH.
Φαίνεται ότι πλέον είναι ο πιο δημοφιλής τρόπος χρήσης του Git, αφού μπορεί να ρυθμιστεί τόσο για να ανώνυμη ανάκτηση όπως κάνει το πρωτόκολλο git:// όσο και για ώθηση με ταυτοποίηση και κρυπτογράφηση όπως το πρωτόκολλο SSH.
Αντί να πρέπει να ορίσουμε διαφορετικές διευθύνσεις URL για αυτά τα δύο πράγματα, μπορούμε πλέον να χρησιμοποιήσουμε μια ενιαία διεύθυνση URL και για τα δύο.
Αν προσπαθήσουμε να ωθήσουμε και το αποθετήριο απαιτεί ταυτοποίηση (όπως κανομικά πρέπει να κάνει), ο διακομιστής μπορεί να ζητήσει όνομα χρήστη και κωδικό πρόσβασης.
Το ίδιο ισχύει και για την πρόσβαση ανάγνωσης.
Μάλιστα, για υπηρεσίες όπως το GitHub, η διεύθυνση URL που χρησιμοποιούμε για την προβολή του αποθετηρίου online (για παράδειγμα, https://github.com/schacon/simplegit) είναι η ίδια διεύθυνση URL που μπορούμε να χρησιμοποιήσουμε για να κλωνοποιήσουμε και, εφόσον έχουμε πρόσβαση, να ωθήσουμε.
Χαζό HTTP
Εάν ο διακομιστής δεν ανταποκρίνεται σε μια υπηρεσία έξυπνου HTTP του Git, ο πελάτης θα προσπαθήσει να χρησιμοποιήσει το απλούστερο πρωτόκολλο Χαζό HTTP.
Το χαζό πρωτόκολλο αναμένει ότι το γυμνό αποθετήριο Git να εξυπηρετείται σαν να επρόκειτο για κανονικά αρχεία από τον web server.
Η ομορφιά του χαζού HTTP είναι η απλότητα στην εγκατάστασή του.
Βασικά, το μόνο που έχουμε να κάνουμε είναι να τοποθετήσουμε ένα γυμνό αποθετήριο Git κάτω από τον ριζικό κατάλογο του εγγράφου HTTP και να δημιουργήσουμε ένα συγκεκριμένο άγκιστρο post-update, και τελειώσαμε (βλ. Τα άγκιστρα του Git).
Σε αυτό το σημείο, οποιοσδήποτε έχει πρόσβαση στον web server κάτω από τον οποίο έχουμε κρεμάσει το αποθετήριο, μπορεί επίσης να κλωνοποιήσει το αποθετήριο.
Για να επιτρέψουμε πρόσβαση ανάγνωσης στο αποθετήριό μας μέσω HTTP, κάνουμε κάτι σαν αυτό:
$ cd /var/www/htdocs/
$ git clone --bare /path/to/git_project gitproject.git
$ cd gitproject.git
$ mv hooks/post-update.sample hooks/post-update
$ chmod a+x hooks/post-update
Αυτό είναι όλο.
Το άγκιστρο post-update που έρχεται με το Git τρέχει την κατάλληλη εντολή (git update-server-info) για να κάνει την ανάκτηση και κλωνοποίηση μέσω HTTP να λειτουργούν σωστά.
Αυτή η εντολή εκτελείται όταν ωθούμε σε αυτό το αποθετήριο (ίσως μέσω SSH)· τότε, κάποιος μπορεί να κλωνοποιήσει με κάτι σαν:
$ git clone https://example.com/gitproject.git
Στη συγκεκριμένη περίπτωση, χρησιμοποιούμε τη διαδρομή /var/www/htdocs που είναι κοινή για διακομιστές Apache, αλλά μπορούμε να χρησιμοποιήσουμε οποιονδήποτε στατικό web server — απλά τοποθετούμε το γυμνό αποθετήριο στη διαδρομή του.
Τα δεδομένα Git διακομίζονται ως απλά στατικά αρχεία (βλ. ενότητα Εσωτερική λειτουργία του Git για λεπτομέρειες σχετικά με τον τρόπο με τον οποίο διακομίζονται).
Σε γενικές γραμμές, επιλέγουμε είτε να τρέξουμε έναν διακομιστή με έξυπνο HTTP για ανάγνωση/εγγραφή είτε απλά να έχουμε πρόσβαση στα αρχεία για ανάγνωση μόνο με τον χαζό τρόπο. Σπάνια συνδυάζονται αυτές οι δύο υπηρεσίες.
Τα υπέρ
Θα επικεντρωθούμε στα πλεονεκτήματα της έξυπνης έκδοσης του πρωτοκόλλου HTTP.
Η ευκολία να χρειάζεται μόνον μία ενιαία διεύθυνση URL για όλους τους τύπους πρόσβασης και η προτροπή για ταυτοποίηση από τον διακομιστή μόνο όταν απαιτείται έλεγχος ταυτότητας κάνουν τα πράγματα πολύ απλά για τον τελικό χρήστη. Η ταυτοποίηση με όνομα χρήστη και κωδικό πρόσβασης είναι επίσης ένα μεγάλο πλεονέκτημα έναντι του SSH, δεδομένου ότι οι χρήστες δεν χρειάζεται να παράγουν τοπικά κλειδιά SSH και να φορτώνουν το δημόσιο κλειδί τους στον εξυπηρετητή πριν μπορέσουν να επικοινωνήσουν με αυτόν. Για λιγότερο προηγμένους χρήστες ή χρήστες σε συστήματα όπου το SSH δεν είναι σύνηθες, αυτό αποτελεί σημαντικό πλεονέκτημα στη χρηστικότητα. Είναι επίσης ένα πολύ γρήγορο και αποτελεσματικό πρωτόκολλο, παρόμοιο με το SSH.
Μπορούμε επίσης να διαθέτουμε τα αποθετήριά μας μόνο για ανάγνωση μέσω HTTPS, πράγμα που σημαίνει ότι μπορούμε να κρυπτογραφήσoyme τη μεταφορά του περιεχομένου· ή μπορούμε να ακόμα να κάνουμε τους πελάτες να χρησιμοποιούν ειδικά υπογεγραμμένα πιστοποιητικά SSL.
Ένα άλλο υπέρ είναι ότι το HTTPS είναι τόσο διαδεδομένο πρωτόκολλο που συχνά τα εταιρικά firewall ρυθμίζονται με τέτοιον τρόπο ώστε να επιτρέπουν την κίνηση δεδομένων μέσω αυτών των θυρών.
Τα κατά
Το Git μέσω HTTPS εγκαθίσταται λίγο πιο δύσκολα σε σύγκριση με το SSH σε ορισμένους διακομιστές. Εκτός από αυτό, τα άλλα πρωτόκολλα δεν έχουν κανένα σημαντικό πλεονέκτημα σε σύγκριση με το πρωτόκολλο Έξυπνο HTTP όσον αφορά στο Git.
Αν χρησιμοποιούμε HTTP για ταυτοποίηση ώθησης, η παροχή των διαπιστευτηρίων είναι κάποιες φορές πιο πολύπλοκη από τη χρήση κλειδιών SSH. Ωστόσο, υπάρχουν αρκετά εργαλεία προσωρινής αποθήκευσης διαπιστευτηρίων που μπορούμε να χρησιμοποιήσουμε, συμπεριλαμβανομένων των Keychain στο MacOS και Credential Manager στα Windows, που καθιστούν τη διαδικασία ταυτοποίησης αρκετά ανώδυνη. Στην ενότητα Αποθήκευση διαπιστευτηρίων μπορούμε να δουμε πώς μπορούμε να ρυθμίσουμε ασφαλή προσωρινή αποθήκευση κωδικού πρόσβασης HTTP στο σύστημά μας.
Το πρωτόκολλο SSH
Ένα κοινό πρωτόκολλο μεταφοράς για το Git όταν αυτο-φιλοξενείται είναι το SSH. Αυτό οφείλεται στο ότι η πρόσβαση σε διακομιστές μέσω SSH είναι ήδη ρυθμισμένη — και αν δεν είναι, είναι εύκολο να γίνει. Το SSH είναι επίσης πρωτόκολλο ταυτοποιημένου δικτύου και επειδή είναι πανταχού παρόν είναι γενικά εύκολο να εγκαταστασθεί και να χρησιμοποιηθεί.
Για να κλωνοποιήσουμε ένα αποθετήριο Git πάνω από SSH, μπορούμε να ορίσουμε το URL ssh:// ως εξής:
$ git clone ssh://[user@]server/project.git
Ή μπορούμε να χρησιμοποιήσουμε τη συντομότερη σύνταξη τύπου scp για το πρωτόκολλο SSH:
$ git clone [user@]server:project.git
Και στις δύο περιπτώσεις, αν δεν ορίσουμε το όνομα χρήστη, το Git χρησιμοποιεί το όνομα χρήστη που έχουμε στο σύστημά μας.
Τα υπέρ
Τo SSH έχει πολλά πλεονεκτήματα Κατ' αρχάς το SSH είναι σχετικά εύκολο να εγκατασταθεί — οι δαίμονες SSH είναι πολύ συνηθισμένοι, πολλοί διαχειριστές δικτύου έχουν εμπειρία με αυτούς και πολλά λειτουργικά συστήματα είναι εγκατεστημένα με αυτούς ή έχουν εργαλεία να τους διαχειρίζονται. Ακόμα, η πρόσβαση μέσω SSH είναι ασφαλής — όλη η μεταφορά δεδομένων είναι κρυπτογραφημένη και απαιτεί ταυτοποίηση. Τέλος, όπως και το HTTPS, το Git και το πρωτόκολο local, το SSH είναι αποδοτικό με την έννοια ότι συμπιέζει τα δεδομένα όσο είναι δυνατό πριν τη μεταφορά.
Τα κατά
Το μειονέκτημα του SSH είναι ότι δεν υποστηρίζει ανώνυμη πρόσβαση στο αποθετήριό μας. Οι χρήστες πρέπει να έχουν πρόσβαση μέσω SSH στον υπολογιστή μας ακόμα και αν είναι μόνο-για-ανάγνωση, κάτι που δεν καθιστά την πρόσβαση μέσα από SSH ενδεδειγμένη για έργα ανοικτού κώδικα, στα οποία οι χρήστες μπορεί να θέλουν μόνο να κλωνοποιήσουν το αποθετήριό μας για να το εξετάσουν. Αν το χρησιμοποιούμε μόνο εντός του εταιρικού δικτύου μας, το SSH ίσως είναι το μοναδικό πρωτόκολλο που θα χρειαστούμε. Αν θέλουμε να επιτρέψουμε ανώνυμη πρόσβαση για ανάγνωση μόνο στα έργα μας και επίσης θέλουμε να χρησιμοποιούμε το SSH, θα πρέπει να εγκαταστήσουμε το SSH για εμάς ώστε να ωθούμε μέσα από το SSH, αλλά κάποιο άλλο πρωτόκολλο για να ανακτήσουν (fetch) όλοι οι υπόλοιποι.
Το πρωτόκολλο Git
Τέλος, έχουμε το πρωτόκολλο Git.
Το πρωτόκολλο Git είναι ένας ειδικός δαίμονας που έρχεται μαζί με το Git· ακούει στη θύρα 9418 που παρέχει μία υπηρεσία παρόμοια με το πρωτόκολλο SSH αλλά με απολύτως καμία ταυτοποίηση ή κρυπτογράφηση.
Για να διαθέσουμε ένα αποθετήριο πάνω από το πρωτόκολλο Git, πρέπει να δημιουργήσουμε το αρχείο git-daemon-export-ok — ο δαίμονας δεν θα σερβίρει το αποθετήριο αν δεν έχει αυτό το αρχείο — αλλά πέρα από αυτό δεν υπάρχει καμία ασφάλεια.
Είτε το αποθετήριο Git είναι διαθέσιμο σε όλους να το κλωνοποιήσουν είτε σε κανέναν.
Αυτό σημαίνει ότι γενικά δεν γίνεται ώθηση πάνω από αυτό το πρωτόκολλο.
Μπορούμε να ενεργοποιήσουμε την πρόσβαση ώθησης, αλλά δεδομένης της έλλειψης ταυτοποίησης αν ενεργοποιήσουμε την πρόσβαση ώθησης, οποιοσδήποτε βρίσκει το URL του έργου μας στο Internet, θα μπορεί να ωθήσει σε αυτό.
Είναι προφανές ότι αυτή η συμπεριφορά είναι σπάνια επιθυμητή.
Τα υπέρ
Το πρωτόκολλο Git είναι συχνά το πιο γρήγορο διαθέσιμο πρωτόκολλο μεταφοράς μέσα από δίκτυο. Αν πρέπει να εξυπηρετούμε κυκλοφορία πολλών δεδομένων για ένα δημόσιο έργο ή ένα πολύ μεγάλο έργο που δεν απαιτεί ταυτοποίηση χρηστών για πρόσβαση ανάγνωσης, μάλλον θα θέλουμε έναν δαίμονα Git για να εξυπηρετήσουμε το έργο μας. Χρησιμοποιεί τον ίδιο μηχανισμό μεταφοράς δεδομένων με το πρωτόκολλο SSH αλλά χωρίς την επιβάρυνση της κρυπτογράφησης και ταυτοποίησης.
Τα κατά
Λόγω της έλλειψης TLS ή άλλης κρυπτογράφησης, η κλωνοποίηση μέσω git:// μπορεί να οδηγήσει σε αυθαίρετο κενό ασφάλειας εκτέλεσης κώδικα και συνεπώς πρέπει να αποφεύγεται εκτός κι αν γνωρίζουμε πολύ καλά τι κάνουμε.
-
Αν εκτελέσουμε
git clone git://example.com/project.git, κάποιος κακόβουλος που ελέγχει, π.χ. τον router μας μπορεί να τροποποιήσει το αποθετήριο που μόλις κλωνοποιήσαμε, εισάγοντας κακόβουλο κώδικα σε αυτό. Αν μετά μεταγλωττίσουμε/εκτελέσουμε τον κώδικα που μόλις κλωνοποιήσαμε, θα εκτελέσουμε τον κακόβουλο κώδικα. Η εκτέλεση της εντολήςgit clone http://example.com/project.gitπρέπει να αποφεύγεται για τον ίδιο λόγο. -
Η εκτέλεση της εντολής
git clone https://example.com/project.gitδεν παρουσιάζει το ίδιο πρόβλημα (εκτός κι αν ο κακόβουλος χρήστης παράσχει πιστοποιητικό TLS για το example.com). Η εκτέλεση της εντολήςgit clone git@example.com:project.gitπαρουσιάζει αυτό το πρόβλημα αν αποδεχτούμε ένα λανθασμένο αποτύπωμα κλειδιού SSH.
Επίσης δεν έχει ταυτοποίηση, δηλαδή ο καθένας μπορεί να κλωνοποιήσει το αποθετήριο (αν και συχνά αυτό ακριβώς θέλουμε).
Επίσης είναι πιθανότατα το πιο δύσκολο πρωτόκολλο από πλευράς ρύθμισης.
Πρέπει να τρέχει το δικό του δαίμονα, που απαιτεί ρύθμιση xinetd ή systemd ή κάτι παρόμοιο, το οποίο δεν είναι πάντα εύκολο.
Απαιτεί επίσης πρόσβαση στη θύρα 9418 του firewall, που δεν είναι κάποια από τις τυποποιημένες θύρες που επιτρέπουν τα firewall των εταιρικών δικτύων.
Πίσω από τα firewall μεγάλων εταιρειών, αυτή η ασυνήθιστη θύρα είναι συνήθως μπλοκαρισμένη.