Dotfiles σε Git Bare για εύκολη μεταφορά ρυθμίσεων

Οι ρυθμίσεις τον εφαρμογών του χρήστη σε ένα 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 αποθετήριο.

Advertisements

Τι είναι το 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
Advertisements

Εγκαταστήστε τα 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)

2 σκέψεις σχετικά με το “Dotfiles σε Git Bare για εύκολη μεταφορά ρυθμίσεων

  1. Πολύ ενδιαφέρον άρθρο και εργαλείο! Όντως μας προτείνεις μια ωραία και κομψή λύση. Μου αρέσει και το bash script που παραθέτεις για την επιπλέον ευκολία.

    Ευχαριστούμε.

Σου άρεσε το άρθρο; Πες την άποψή σου... έστω και Ανώνυμα:

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση /  Αλλαγή )

Φωτογραφία Google

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google. Αποσύνδεση /  Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση /  Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση /  Αλλαγή )

Σύνδεση με %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.