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ásosgit
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 meguntracked
-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ítsdno
-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.