Disclaimer: a cím kissé túlzó, vannak más bevált megoldások is a problémára. Az alábbi technikát azonban nagyon elegánsnak tartom.

Nemrég olvastam erről a csodálatos technikáról egy Hacker News szálban, amely az emberek megoldásairól szólt a dotfiles tárolására. A StreakyCobra felhasználó megmutatta az ő elegáns beállítását és … Annyira sok értelme volt! Azon vagyok, hogy a saját rendszeremet átállítsam ugyanerre a technikára. Az egyetlen előfeltétel a Git telepítése.

Az ő szavaival élve az alábbi technika megköveteli:

Nincs extra tooling, nincsenek symlinkek, a fájlok követése verziókezelő rendszerben történik, különböző ágakat használhatsz különböző számítógépeken, új telepítéskor könnyen replikálhatod a konfigurációdat.

A technika lényege, hogy egy csupasz Git-tárat egy “oldalsó” mappában (például $HOME/.cfg vagy $HOME/.myconfig) tárolunk egy speciálisan kialakított alias segítségével, így a parancsok az adott tár ellen futnak, és nem a szokásos .git helyi mappa ellen, ami zavarná a többi Git-tárat a környéken.

Kezdjük a nulláról

Ha eddig nem követtük a konfigurációinkat egy Git-tárban, akkor a következő sorokkal könnyen elkezdhetjük használni ezt a technikát:

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
  • Az első sor létrehoz egy ~/.cfg mappát, ami egy csupasz Git-tár, ami követni fogja a fájljainkat.
  • Ezután létrehozunk egy config aliast, amelyet a szokásos git helyett fogunk használni, amikor a konfigurációs adattárunkkal akarunk kapcsolatba lépni.
  • Egy – az adattárhoz lokálisan tartozó – flaget állítunk be, hogy elrejtsük azokat a fájlokat, amelyeket még nem követünk explicit módon. Ez azért van, hogy amikor később beírjuk a config status és más parancsokat, a fájlok, amelyek követése nem érdekel minket, ne jelenjenek meg untracked-ként.
  • Az alias definíciót kézzel is hozzáadhatjuk a .bashrc-hez, vagy használhatjuk a kényelem érdekében megadott negyedik sort.

A fenti sorokat egy snippetbe csomagoltam fel a Bitbucketre, és egy rövid url-ről linkeltem. Így beállíthatod a dolgokat:

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

A beállítás végrehajtása után a $HOME mappában lévő bármelyik fájlt a normál parancsokkal verziózhatod, a git helyettesítve az újonnan létrehozott config aliasoddal, például:

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

Telepítse a dotfileseit egy új rendszerre (vagy migráljon erre a beállításra)

Ha már tárolja a konfigurációját/dotfileseit egy Git tárolóban, egy új rendszeren a következő lépésekkel migrálhat erre a beállításra:

  • A telepítést megelőzően győződjön meg róla, hogy az alias-t a .bashrc vagy .zsh rendszerébe rögzítette:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • És hogy a forrás-tárad figyelmen kívül hagyja a mappát, ahová klónozni fogod, hogy ne okozz furcsa rekurziós problémákat:
echo ".cfg" >> .gitignore
  • Most klónozd a dotfileket egy csupasz repositoryba a $HOME “dot” mappádba:
git clone --bare <git-repo-url> $HOME/.cfg
  • Definiáld az aliast az aktuális shell hatókörében:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Keresd ki a tényleges tartalmat a csupasz tárból a $HOME:
config checkout
  • A fenti lépés a következő üzenettel sikertelen lehet:
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

Ez azért van, mert a $HOME mappádban lehet, hogy már van néhány állománykonfigurációs fájl, amelyeket a Git felülírna. A megoldás egyszerű: készíts biztonsági mentést a fájlokról, ha fontosak, távolítsd el őket, ha nem érdekelnek. Adok egy lehetséges durva parancsikont, amivel az összes sérelmes fájlt automatikusan áthelyezheted a biztonsági mentés mappába:

mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | \
xargs -I{} mv {} .config-backup/{}
  • Futtasd újra a checkoutot, ha gondjaid voltak:
config checkout
  • Az showUntrackedFiles zászlót állítsd no-ra ezen az adott (helyi) tárolón:
config config --local status.showUntrackedFiles no
  • Készen vagy, mostantól kezdve a config parancsokat írhatod be a dotfájlok hozzáadásához és frissítéséhez:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Még egy rövidítésként, hogy ne kelljen emlékezned ezekre a lépésekre minden új gépen, amit be akarsz állítani, létrehozhatsz egy egyszerű szkriptet, tárolhatod Bitbucket snippetként, ahogy én tettem, létrehozhatsz egy rövid url-t hozzá és hívhatod így:

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

A teljesség kedvéért ez lett a végeredmény (sok friss Alpine Linux konténeren teszteltem, hogy kipróbáljam):

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

Wrapping up

Remélem, hasznosnak találod ezt a technikát a konfigurációd követéséhez. Ha kíváncsi vagy, a dotfile-om itt él. Továbbá kérlek, maradj kapcsolatban a @durdn vagy az én fantasztikus csapatom követésével a @atlassiandev.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.