Disclaimer: titlul este ușor hiperbolic, există și alte soluții dovedite la această problemă. Totuși, cred că tehnica de mai jos este foarte elegantă.

Recent am citit despre această tehnică uimitoare într-un fir de discuție Hacker News despre soluțiile oamenilor pentru a-și stoca dotfiles. Utilizatorul StreakyCobra a arătat configurația sa elegantă și … Avea atât de mult sens! Sunt în proces de trecere a propriului meu sistem la aceeași tehnică. Singura condiție prealabilă este instalarea Git.

În cuvintele sale, tehnica de mai jos necesită:

Nici unelte suplimentare, nici legături simbolice, fișierele sunt urmărite pe un sistem de control al versiunilor, puteți folosi ramuri diferite pentru diferite computere, puteți replica cu ușurință configurația la o nouă instalare.

Tehnica constă în stocarea unui depozit Git bare într-un dosar „lateral” (cum ar fi $HOME/.cfg sau $HOME/.myconfig) folosind un alias special creat, astfel încât comenzile să fie rulate împotriva acelui depozit și nu împotriva dosarului local obișnuit .git, care ar interfera cu orice alte depozite Git din jur.

Pornind de la zero

Dacă nu v-ați urmărit până acum configurațiile într-un depozit Git, puteți începe să folosiți această tehnică cu ușurință cu aceste linii:

git init --bare $HOME/.cfg
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrc
  • Prima linie creează un folder ~/.cfg care este un depozit Git bare care va urmări fișierele noastre.
  • Apoi creăm un alias config pe care îl vom folosi în loc de obișnuitul git atunci când vrem să interacționăm cu depozitul nostru de configurare.
  • Setăm un indicator – local pentru depozit – pentru a ascunde fișierele pe care nu le urmărim încă în mod explicit. Acest lucru este astfel încât, atunci când tastați config status și alte comenzi mai târziu, fișierele pe care nu sunteți interesați să le urmăriți nu vor apărea ca untracked.
  • De asemenea, puteți adăuga manual definiția aliasului în .bashrc sau puteți folosi a patra linie furnizată pentru comoditate.

Am împachetat liniile de mai sus într-un fragment pe Bitbucket și l-am legat de un short-url. Astfel încât să puteți configura lucrurile cu:

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

După ce ați executat configurarea, orice fișier din folderul $HOME poate fi versionat cu comenzi normale, înlocuind git cu aliasul config nou creat, ca de exemplu:

config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Instalați fișierele dotfiles pe un sistem nou (sau migrați la această configurație)

Dacă vă stocați deja configurația/fișierele dotfiles într-un depozit Git, pe un sistem nou puteți migra la această configurație cu următorii pași:

  • Înainte de instalare asigurați-vă că ați confirmat aliasul în .bashrc sau .zsh:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Și că depozitul sursă ignoră folderul în care îl veți clona, astfel încât să nu creați probleme ciudate de recursivitate:
echo ".cfg" >> .gitignore
  • Acum clonați fișierele dot într-un depozit gol, într-un dosar „dot” al vostru $HOME:
git clone --bare <git-repo-url> $HOME/.cfg
  • Definiți aliasul în domeniul de aplicare curent al shell-ului:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Checkout the actual content from the bare repository to your $HOME:
config checkout
  • Etapa de mai sus ar putea eșua cu un mesaj de genul:
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

Acest lucru se datorează faptului că dosarul dvs. $HOME ar putea avea deja unele fișiere de configurare stoc care ar fi suprascrise de Git. Soluția este simplă: faceți o copie de rezervă a fișierelor dacă vă pasă de ele, eliminați-le dacă nu vă pasă. Vă pun la dispoziție o posibilă scurtătură aproximativă pentru a muta automat toate fișierele incriminate într-un folder de backup:

mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | \
xargs -I{} mv {} .config-backup/{}
  • Rexecutați din nou verificarea dacă ați avut probleme:
config checkout
  • Setați flag-ul showUntrackedFiles la no pe acest depozit specific (local):
config config --local status.showUntrackedFiles no
  • Ați terminat, de acum înainte puteți tasta comenzile config pentru a adăuga și actualiza dotfiles:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Încă o dată, ca o scurtătură pentru a nu trebui să vă amintiți toți acești pași pe orice mașină nouă pe care doriți să o configurați, puteți crea un script simplu, îl puteți stoca ca snippet Bitbucket așa cum am făcut eu, creați un url scurt pentru el și apelați-l astfel:

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

Pentru a fi complet, iată ce am obținut la final (testat pe mai multe containere Alpine Linux proaspăt lansate pentru a-l testa):

git clone --bare https://bitbucket.org/durdn/cfg.git $HOME/.cfg
function config {
/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME $@
}
mkdir -p .config-backup
config checkout
if ; then
echo "Checked out config.";
else
echo "Backing up pre-existing dot files.";
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles no

Încheiere

Sper că această tehnică vă este utilă pentru a vă urmări configurația. Dacă sunteți curioși, dotfiles-urile mele trăiesc aici. De asemenea, vă rog să rămâneți conectați urmărind @durdn sau echipa mea minunată la @atlassiandev.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.