Dotfiles: il modo migliore per archiviare in un semplice repository Git

Avvertenza: il titolo è leggermente iperbolico, ci sono altre soluzioni comprovate al problema. Penso però che la tecnica qui sotto sia molto elegante.

Recentemente ho letto di questa straordinaria tecnica in un thread di Hacker News sulle soluzioni utilizzate dalle persone per archiviare i propri dotfile. L'utente StreakyCobraha mostrato la sua configurazione elegante e... aveva molto senso! Sto iniziando ad applicare questa stessa tecnica al mio sistema. L'unico prerequisito è installare Git.

Nelle sue parole, la tecnica seguente richiede:

Nessuno strumento aggiuntivo, nessun link simbolico, i file vengono tracciati su un sistema di controllo delle versioni, puoi usare branch diversi per computer diversi, puoi replicare facilmente la tua configurazione su una nuova installazione.

La tecnica consiste nell'archiviare un semplice repository Git in una "laterale" (come $HOME/.cfg o $HOME/.myconfig) usando un alias appositamente predisposto in modo che i comandi vengano eseguiti su quel repository e non sulla solita cartella locale .git, che interferirebbe con qualsiasi altro repository Git in circolazione.

Iniziare da zero

Se non hai mai monitorato le tue configurazioni in un repository Git, puoi iniziare a usare questa tecnica facilmente con queste righe:

1git init --bare $HOME/.cfg
2alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
3config config --local status.showUntrackedFiles no
4echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrc
  • La prima riga crea una cartella ~/.cfg che è un semplice repository Git che terrà traccia dei nostri file.

  • Quindi creiamo una configurazione alias che useremo al posto del normale git quando vogliamo interagire con il nostro repository di configurazione.

  • Abbiamo impostato un flag, locale per il repository, per nascondere i file che non stiamo ancora tracciando esplicitamente. In questo modo quando digiti config status e altri comandi in un secondo momento, i file che non ti interessa tracciare non vengano visualizzati come non tracciati.

  • Inoltre, puoi aggiungere manualmente la definizione dell'alias al tuo .bashrc o utilizzare la quarta riga fornita per comodità.

Ho impacchettato le righe precedenti in un frammento su Bitbucket e l'ho collegato da un URL breve. Puoi quindi configurare il tutto con:

1curl -Lks http://bit.do/cfg-init | /bin/bash

Dopo aver eseguito l'installazione, qualsiasi file all'interno della cartella $HOME può essere aggiornato con i normali comandi, sostituendo git con il tuo alias di configurazione appena creato, come:

1config status
2config add .vimrc
3config commit -m "Add vimrc"
4config add .bashrc
5config commit -m "Add bashrc"
6config push

Installa i tuoi dotfile su un nuovo sistema (o esegui la migrazione a questa configurazione)

Se archivi già la tua configurazione/dotfile in un repository Git, su un nuovo sistema puoi migrare a questa configurazione con i seguenti passaggi:

  • Prima dell'installazione assicurati di aver eseguito il commit dell'alias sul tuo .bashrc o .zsh:

1alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • E che il tuo repository di origine ignori la cartella in cui lo clonerai, in modo da non creare strani problemi di ricorsione:

1echo ".cfg" >> .gitignore
  • Ora clona i tuoi dotfile in un semplice repository in una cartella "dot" della tua $HOME:

1git clone --bare <git-repo-url> $HOME/.cfg
  • Definisci l'alias nell'ambito della shell corrente:

1alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Esegui il check-out dei contenuti effettivi dal semplice repository al tuo $HOME:

1config checkout
  • Il passaggio precedente potrebbe fallire con un messaggio del tipo:

1error: The following untracked working tree files would be overwritten by checkout:
2    .bashrc
3    .gitignore
4Please move or remove them before you can switch branches.
5Aborting

Questo perché la tua cartella $HOME potrebbe già contenere alcuni file di configurazione stock che verrebbero sovrascritti da Git. La soluzione è semplice: fai il backup dei file se ti interessano, rimuovili in caso contrario. Ti fornisco una possibile scorciatoia approssimativa per spostare automaticamente tutti i file in questione in una cartella di backup:

1mkdir -p .config-backup && \
2config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
3xargs -I{} mv {} .config-backup/{}
  • Esegui nuovamente il check-out in caso di problemi:

1config checkout
  • Imposta il flag showUntrackedFiles su no in questo repository specifico (locale):

1config config --local status.showUntrackedFiles no
  • Hai finito, d'ora in poi puoi digitare i comandi config per aggiungere e aggiornare i tuoi dotfile:

1config status
2config add .vimrc
3config commit -m "Add vimrc"
4config add .bashrc
5config commit -m "Add bashrc"
6config push

Ancora una volta, come scorciatoia per non dover ricordare tutti questi passaggi su qualsiasi nuovo computer che desideri configurare, puoi creare un semplice script, archiviarlo come frammento di Bitbucket come ho fatto io, creare un breve URL e chiamarlo così:

1curl -Lks http://bit.do/cfg-install | /bin/bash

Per completezza, questo è ciò che ho ottenuto (testato su molti container Alpine Linux appena coniati per testarlo):

1git clone --bare https://bitbucket.org/durdn/cfg.git $HOME/.cfg
2function config {
3   /usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME $@
4}
5mkdir -p .config-backup
6config checkout
7if [ $? = 0 ]; then
8  echo "Checked out config.";
9  else
10    echo "Backing up pre-existing dot files.";
11    config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .config-backup/{}
12fi;
13config checkout
14config config status.showUntrackedFiles no

Conclusione

Spero che questa tecnica sia utile per tenere traccia della tua configurazione. Se sei curioso, i miei dotfile vivono qui. Inoltre, continua a seguire me @durdn o il mio fantastico team @atlassiandev.

Consigliata per te

Blog di Bitbucket

Percorso di apprendimento DevOps

Scopri di più su Git

Trova altre guide e risorse su Git in questo hub.

Morty Proxy This is a proxified and sanitized view of the page, visit original site.