Το git status σέρνεται σε SSHFS μέσω VPN: μετακινήστε τη δουλειά
Ένα μεγάλο αρχείο αντιγράφεται γρήγορα και το git status σέρνεται. Αν το δέντρο βρίσκεται σε SSHFS μέσω VPN, το κόστος είναι τα ταξίδια ανά αρχείο, όχι το εύρος ζώνης. Μετακινήστε τη δουλειά.
Αντιγράψτε ένα αρχείο 200 MB και πετάει. Εκτελέστε git status στον ίδιο κατάλογο και η αναμονή θα είναι αρκετά μεγάλη για να αλλάξετε δουλειά. Οι δύο παρατηρήσεις δεν αντιφάσκουν, γιατί η μαζική μεταφορά μετρά τη διεκπεραίωση, ενώ το Git μετρά πόσες μικρές ερωτήσεις στο σύστημα αρχείων μπορεί να κάνει το δευτερόλεπτο, και ένα προσαρτημένο απομακρυσμένο δέντρο μετατρέπει κάθε ερώτηση σε ταξίδι μετ' επιστροφής. Το να πειράξετε το VPN δεν θα διορθώσει φόρτο με λάθος σχήμα.
Γιατί το status είναι λάθος μέτρο
Το Git πρέπει να μάθει για πολλά αρχεία: ποια έχουν αλλάξει, ποια δεν παρακολουθούνται και αν τα αποθηκευμένα δεδομένα του ευρετηρίου ταιριάζουν ακόμη με ό,τι βρίσκεται στον δίσκο. Μέσω SSHFS καθεμία από αυτές τις παρατηρήσεις μπορεί να είναι δικτυακή πράξη. Η μονάδα εργασίας εδώ είναι ο αριθμός αρχείων, όχι τα megabyte.
Γι' αυτό το πρώτο status μετά από κλωνοποίηση είναι αργό και γι' αυτό τα επόμενα μπορεί να είναι ακόμη πιο αργά σε δέντρο γεμάτο έξοδο μεταγλώττισης. Η σάρωση μη παρακολουθούμενων διασχίζει καταλόγους που ίσως δεν σας ενδιαφέρουν, και κάθε βήμα είναι άλλο ένα αίτημα μέσω της σύνδεσης. Σε διαδρομή 40 ms ένα δέντρο με μερικές χιλιάδες καταχωρίσεις γίνεται μερικές χιλιάδες ταξίδια. Δεν χρειάζεται σύλληψη πακέτων για να επιβεβαιωθεί αυτή η αριθμητική.
Ένα σημείο αναφοράς λήψης σάς λέει ότι η σύνδεση είναι καλή· δεν λέει τίποτα για το αν χίλιες μικρές αναγνώσεις θα τελειώσουν σήμερα το απόγευμα.
Μετακινήστε το δέντρο εργασίας, όχι τα κουμπιά ρύθμισης
Ένας τοπικός κλώνος βάζει το δέντρο εργασίας, το ευρετήριο και τις πράξεις Git στο ίδιο μηχάνημα. Το pull γίνεται ορατό δικτυακό βήμα αντί να γίνεται κάθε έλεγχος αρχείου.
Αυτό ταιριάζει όποτε ο προγραμματιστής μπορεί να κρατήσει τον απαιτούμενο κώδικα τοπικά, που είναι τις περισσότερες φορές. Οξύνει επίσης το όριο μεταξύ commit και ανάπτυξης, γιατί η επεξεργασία τοπικού αρχείου δεν αλλάζει πια κατά λάθος μια απομακρυσμένη υπηρεσία που τρέχει· η αλλαγή πρέπει να προωθηθεί και να αναπτυχθεί όπως οτιδήποτε άλλο. Το αντίτιμο είναι ότι ο κώδικας υπάρχει σε δύο σημεία, οπότε αποφασίστε ποιο αντίγραφο είναι έγκυρο και πώς μια γρήγορη διόρθωση στον διακομιστή επιστρέφει στο αποθετήριο. Αυτή η συζήτηση είναι φθηνότερη από μια εντολή status που κανείς δεν θέλει να τρέξει.
Αν ο χώρος εργασίας πρέπει να μείνει απομακρυσμένος, τρέξτε το Git εκεί
Μερικές φορές ο χώρος εργασίας δεν μπορεί να μετακινηθεί: η μεταγλώττιση χρειάζεται εκείνο το περιβάλλον, τα δεδομένα είναι πολύ μεγάλα ή η πολιτική κρατά τον κώδικα στον κεντρικό υπολογιστή. Τότε τρέξτε το Git και τα σχετικά εργαλεία ανάπτυξης δίπλα στα αρχεία, μέσω εγκεκριμένου απομακρυσμένου κελύφους ή περιβάλλοντος απομακρυσμένης ανάπτυξης. Ο επεξεργαστής μπορεί να μείνει στο φορητό, ενώ το backend του δουλεύει δίπλα στο δέντρο εργασίας.
Οι ακριβές πράξεις γίνονται τότε τοπικά στον απομακρυσμένο κεντρικό υπολογιστή, και το δίκτυο μεταφέρει κίνηση του επεξεργαστή αντί για χιλιάδες κλήσεις stat. Είναι η ίδια διόρθωση με τον τοπικό κλώνο, εκφρασμένη ως επιλογή ανάπτυξης και όχι ως μετανάστευση.
Ο συγχρονισμός είναι ροή εργασίας με ιδιοκτήτες, όχι κρυφή μνήμη
Ένας συγχρονισμένος χώρος εργασίας μπορεί να κόψει επαναλαμβανόμενες απομακρυσμένες αναγνώσεις, αλλά δεν είναι διαφανής κρυφή μνήμη. Χρειάζεται ιδιοκτήτη για κάθε αλλαγή, κανόνα για συγκρούσεις και συμφωνία για τα παραγόμενα αρχεία που και οι δύο πλευρές θεωρούν δικά τους. Χωρίς αυτούς τους κανόνες η ρύθμιση δημιουργεί διχογνωμία αντί για ευκολία.
Ένας αμφίδρομος συγχρονιστής χωρίς αυτούς παράγει διαφορετικό πρόβλημα από εκείνο που έλυσε, συνήθως μια συγχώνευση που κανείς δεν μπορεί να αποδώσει. Αποφύγετε να τρέχετε δύο διεργασίες Git σε ένα κοινό δέντρο εργασίας, εκτός αν καταλαβαίνετε πώς συντονίζονται.
Έπειτα ρυθμίστε, και κρατήστε το SSH λογικό
Όταν η ρύθμιση είναι σωστή, δύο επιλογές αλλάζουν για πόσα αρχεία πρέπει να ρωτήσει το Git: status.showUntrackedFiles και η κρυφή μνήμη μη παρακολουθούμενων πίσω από core.untrackedCache. Καμία δεν αλλάζει το κόστος κάθε ερώτησης στα 40 ms· αλλάζουν μόνο πόσες ερωτήσεις υπάρχουν. Γυρίστε ένα κουμπί μόνο όταν τα ταξίδια είναι τοπικά.
Μετρήστε τον χρόνο της εντολής που σας εκνευρίζει αντί να συλλογίζεστε από ένα σημείο αναφοράς που αντιγράφει ένα μεγάλο αρχείο, και αφήστε την υποστηριζόμενη κρυπτογράφηση SSH ήσυχη. Ένας παρωχημένος κρυπταλγόριθμος δεν συντομεύει ένα ταξίδι· προσθέτει ένα δεύτερο πρόβλημα που επιζεί του πρώτου. Η αναφορά του git status αξίζει ένα διάβασμα, γιατί η εντολή κάνει πολύ περισσότερη δουλειά απ' όση υπονοεί το όνομά της.