Οι ρυθμίσεις τον εφαρμογών του χρήστη σε ένα Unix/Linux λειτουργικό αποθηκεύονται σε κρυφά αρχεία που ξεκινάνε με τελεία (dotfiles). Ας δούμε έναν εύκολο τρόπο για να τα μεταφέρουμε σε άλλους υπολογιστές για να έχουμε τις ίδιες ρυθμίσεις.
Όταν έχεις, έναν σταθερό, ένα laptop ή και έναν υπολογιστή στην δουλειά και χρησιμοποιείς τις ίδιες εφαρμογές σε όλα τα PC, τότε θες έναν απλό τρόπο να έχεις τις ίδιες ρυθμίσεις των εφαρμογών που χρησιμοποιείς σε όλα τα μηχανάκια.
Αν κάνετε μια αναζήτηση στο διαδίκτυο θα βρείτε διάφορα εργαλεία που υπόσχονται να λύσουν αυτό το πρόβλημα, (π.χ. το GNU Stow, dotdrop, dotbot κ.α.) αλλά προσωπικά είδα ότι προσθέτουν επιπλέον ρυθμίσεις και στο τέλος καταλήγεις με μακαρόνια από symlinks κ.α.
Τι είναι τα Dotfiles;
Αυτές οι ρυθμίσεις συνήθως αποθηκεύονται στον home
κατάλογό σου, σε κρυφούς φακέλους και αρχεία (τα λεγόμενα .dotfiles
) και μπορείς να τα εμφανίσεις πατώντας τον συνδυασμό πλήκτρων Ctrl+H
ή από το τερματικό τρέχοντας ls -a
. Γιαυτό τον λόγο όταν θέλουμε να κάνουμε επαναφορά μια εφαρμογή στις αρχικές τους ρυθμίσεις, απλά διαγράφουμε το σχετικό .dotfile
της εφαρμογής και άρα την επόμενη φορά που ξεκινάει η εφαρμογή ξεκινάει με τις default ρυθμίσεις του.
Αν όμως θέλεις :
- να έχεις τις ίδιες ρυθμίσεις σε όλους τους υπολογιστές
- να κάνεις καθαρή εγκατάσταση του λειτουργικού και θέλεις να είναι όλα όπως πριν το format
- να έχεις αντίγραφο ασφαλείας των ρυθμίσεων
- να δημοσιεύσεις τις προσωπικές σου ρυθμίσεις για τις εφαρμογές που χρησιμοποιείς (π.χ. VIM, tmux, conky κλπ)
τότε μπορείς όλα αυτά να τα πετύχεις με έναν git bare
αποθετήριο.
Τι είναι το Git Bare;
Όσοι χρησιμοποιείτε το git για διαχείριση κώδικα (αν θέλετε να μάθετε περισσότερα για το git δείτε τον σύνδεσμο μας) τότε θυμηθείτε ότι ένας φάκελος git στον υπολογιστή σας, σε πολύ γενικές γραμμές, αποτελείται από δύο στοιχεία:
- .git (κρυφός φάκελος) όπου χρησιμοποιείται ως κατάλογος περιεχομένων και σημείο αναφοράς για το απομακρυσμένο repository (π.χ. github, gitlab, bitbucket κ.α.)
- workspace όπου είναι ο χώρος που βρίσκονται τα αρχεία πάνω στα οποία εργάζεστε
Το git bare
που θα δούμε, «σπάει» την παραπάνω δομή και άρα ανεξαρτητοποιεί τον φάκελο workspace. Αυτό μας είναι χρήσιμο διότι δεν χρειάζεται να χρησιμοποιούμε όλο τον home ως workspace αλλά μόνο τα αρχεία που θέλουμε να δηλώνονται στο git bare
αποθετήριο. Μπερδευτήκατε ; Λογικό.
Δημιουργία Git Bare για δήλωση των Dotfiles
Η παρακάτω διαδικασία προϋποθέτει ότι έχετε κάποιο λογαριασμό σε gitlab, github και γνωρίζετε κάποια βασικά στην διαχείριση του.
Θα ξεκινήσουμε :
- φτιάχνοντας έναν κρυφό φάκελο με όνομα της αρεσκείας μας π.χ.
.dotfiles
στον οποίο θα τρέξουμε τηνgit bare
εντολή - φτιάχνοντας μια δικιά μας εντολή (alias) για να δηλώνουμε τα αρχεία που θέλουμε να καταγράφονται στο παραπάνω κρυφό φάκελο.
Ρύθμιση για διαχείριση των .dotfiles
Πρώτα φτιάχνουμε τον φάκελο στον home φάκελό μας $HOME
, τον εκκινούμε ως git bare
, δημιουργούμε μια alias εντολή της αρεσκείας μας π.χ. dotfile
που θα χρησιμοποιούμε, δηλώνουμε το απομακρυσμένο αποθετήριο για να τα έχουμε ως αντίγραφα, ενημερώνουμε το git
να μην εμφανίζει τα αρχεία που δεν δηλώσαμε και τέλος αντιγράφουμε την alias εντολή
που φτιάξαμε στο αρχείο ρυθμίσεων του κελύφους που χρησιμοποιούμε (π.χ. .bashrc ή .zshrc)
mkdir ~/.dotfiles
git init --bare $HOME/.dotfiles
alias dotfile='git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
dotfile remote add origin <url-του-αποθετηρίου-σας>
dotfile config status.showUntrackedFiles no
echo "alias dotfile='git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'" >> $HOME/.bashrc
Παρακολούθηση των dotfiles με Git
Αφού εκτελέσετε την παραπάνω διαδικασία, οποιοδήποτε αρχείο μέσα στο φάκελο $HOME σας μπορεί να δηλωθεί στο git
σας, αντικαθιστώντας φυσικά την εντολή git
με το alias dotfile που δημιουργήσαμε. Ας το δούμε με απλά παραδείγματα:
dotfile status
dotfile add .vimrc
dotfile commit -m "Προσθήκη vimrc"
dotfile add .bashrc
dotfile commit -m "Προσθήκη bashrc"
dotfile add text.txt
dotfile commit -m "Προσθήκη text.txt"
dotfile push
Από τα παραπάνω αντιλαμβάνεστε ότι θέλει προσοχή τι δηλώνουμε με την εντολή που φτιάξαμε (dotfile) μιας και αν δεν προσέξουμε μπορεί π.χ. να δηλώσουμε κάποιο αρχείο που δεν θέλουμε να είναι δημόσιο στο github/gitlab (εκτός και αν έχουμε private repo).
Αν κάποια στιγμή θέλουμε να αφαιρέσουμε κάποιο αρχείο από την παρακολούθηση (του git) για αλλαγές χωρίς όμως να το διαγράψουμε από το φυσικό μας μηχάνημα τότε χρησιμοποιούμε την παρακάτω διαδικασία:
dotfile rm --cached onoma_arxeiou
dotfile commit -m "Αφαίρεση του onoma_arxeiou"
dotfile push
Εγκαταστήστε τα dotfiles σας σε ένα νέο σύστημα
Ας δούμε τώρα πως θα μεταφέρουμε τα αρχεία ρυθμίσεων σε ένα νέο PC αλλά και την ίδια διαρρύθμιση που κάναμε στο προηγούμενο PC ώστε και το δεύτερο να συμμετέχει στον συγχρονισμό.
Έτσι αν είμαστε στο άλλο PC και κάνουμε μια αλλαγή στις ρυθμίσεις κάποιας εφαρμογής και θέλουμε η ίδια ρύθμιση να είναι διαθέσιμη και για το άλλο PC τότε να μπορούμε να τρέξουμε τις ίδιες εντολές που αναφέραμε στην ενότητα «Παρακολούθηση των dotfiles με Git».
Ρύθμιση του νέου PC για λήψη των dotfiles
Η διαδικασία μοιάζει με την αρχική ρύθμιση που κάναμε στο πρώτο PC με κάποιες μικρές διαφορές:
alias dotfile='git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
echo "alias dotfile='git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'" >> $HOME/.bashrc
echo ".dotfiles" >> .gitignore
git clone --bare <url-του-αποθετηρίου-σας> $HOME/.dotfiles
dotfile config --local status.showUntrackedFiles no
dotfile checkout
Στην τελευταία εντολή dotfile checkout
λογικά θα σας παραπονεθεί με ένα μήνυμα όπως π.χ. το παρακάτω:
error: The following untracked working tree files would be overwritten by checkout:
.bashrc
.gitignore
Please move or remove them before you can switch branches.
Aborting
Πολύ λογικό μιας και αν το git βρει υπάρχοντα αρχεία στο νέο σύστημα (όπως το .bashrc) είναι λογικό να μην προχωρήσει σε αντικατάσταση τους. Άρα η τα κρατάτε πριν προχωρήσετε η τα διαγράφετε. Εναλλακτικά μπορείτε να τρέξετε την παρακάτω εντολή που θα φτιάξει έναν κρυφό φάκελο .config-backup
και θα τα μεταφέρει εκεί
mkdir -p .config-backup && dotfile checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .config-backup/{}
Τώρα μπορείτε να τρέξετε πάλι το dotfile checkout
για να πάρετε τα dotfiles και να μπουν στην θέση τους.
dotfile checkout
Script για ρύθμιση/λήψη των dotfiles στον νέο υπολογιστή
Μπορούμε να ετοιμάσουμε ένα script που αυτοματοποιεί την παραπάνω διαδικασία και να το τρέχουμε σε κάθε νέο PC. Ανοίγουμε ένα νέο αρχείο στον text editor της αρεσκείας μας και προσθέτουμε το παρακάτω (αλλάζοντας το <url-αποθετήριο>
με το δικό σας)
echo "Λήψη αρχείων .dotfiles"
git clone --bare <url-αποθετηρίου> $HOME/.dotfiles
function dotfile {
/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME $@
}
mkdir -p .config-backup
dotfile checkout
if [ $? = 0 ]; then
echo "Έγινε λήψη";
else
echo "Δημιουργία αντιγράφων ασφαλείας για τα υπάρχοντα .dotfiles";
dotfile checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .config-backup/{}
fi;
dotfile checkout
dotfile config status.showUntrackedFiles no
Έστω ότι το αποθηκεύουμε ως configure-dots.sh
. Μπορούμε να στείλουμε αυτό το αρχείο στο ίδιο αποθετήριο με τα dotfiles (πχ στο github) και να το τρέξουμε απευθείας στο νέο PC :
wget -O - https://raw.githubusercontent.com/<username>/<project>/<branch>/<path>/configure-dots.sh | bash
Ενημέρωση και λήψη των αλλαγών στα .dotfiles
Όπως είναι φυσιολογικό αρκετές φορές κάνουμε αλλαγές, προσθέτουμε η αφαιρούμε εφαρμογές και θέλουμε οι ίδιες ρυθμίσεις να είναι διαθέσιμες και στα άλλα PC. Aς το δούμε με το παρακάτω παράδειγμα.
Έστω ότι ήμαστε στον υπολογιστή της δουλειάς και βρήκαμε ένα μακρινάρι από μια πολύ χρήσιμη εντολή/ρύθμιση και θέλουμε να το βάλουμε alias στο .bashrc / .zshrc, αλλά θέλουμε να το έχουμε και στον υπολογιστή του σπιτιού μας. Αφού αποθηκεύσουμε τις αλλαγές, τρέχουμε:
Στον υπολογιστή της δουλειάς:
dotfile status
dotfile add .bashrc # ή όποιο αρχείο αλλάξαμε
dotfile commit -m "Μια σούπερ εντολή, χρήσιμη για το σπίτι"
dotfile push
Στον υπολογιστή του σπιτιού:
dotfile pull
Φυσικά το ίδιο ισχύει και αντίστροφα, όταν δηλαδή κάνουμε αλλαγές στον υπολογιστή του σπιτιού και τις θέλουμε στην δουλειά.
Επίλογος
Η παραπάνω τεχνική δεν αποτελεί χρήσιμη μόνο για dotfiles αλλά για οποιοδήποτε αρχείο στον home
κατάλογό μας αφού το git
δεν ενδιαφέρεται για τον τύπο του αρχείου. Σε αυτή την περίπτωση όμως ίσως καλύτερα να τα έχουμε σε κάποιο private repository του github/gitlab/bitbucket.
Παραπομπές: Dotfiles (Arch Linux wiki)
Πολύ ενδιαφέρον άρθρο και εργαλείο! Όντως μας προτείνεις μια ωραία και κομψή λύση. Μου αρέσει και το bash script που παραθέτεις για την επιπλέον ευκολία.
Ευχαριστούμε.
Να σε καλά, χαίρομαι που σου είναι χρήσιμο.