Disclaimer: titeln är något hyperbolisk, det finns andra beprövade lösningar på problemet. Jag tycker dock att tekniken nedan är mycket elegant.

Nyligen läste jag om denna fantastiska teknik i en tråd i Hacker News om folks lösningar för att lagra sina dotfiles. Användaren StreakyCobra visade sin eleganta installation och … Det var så meningsfullt! Jag håller på att byta mitt eget system till samma teknik. Den enda förutsättningen är att installera Git.

Med hans ord kräver tekniken nedan:

Ingen extra verktyg, inga symlänkar, filerna spåras i ett versionskontrollsystem, du kan använda olika grenar för olika datorer, du kan enkelt replikera din konfiguration vid en ny installation.

Tekniken går ut på att lagra ett Git-repositorium i en ”sidomapp” (som $HOME/.cfg eller $HOME/.myconfig) med hjälp av ett speciellt utformat alias så att kommandon körs mot detta repositorium och inte mot den vanliga .gitlokala mappen, vilket skulle störa alla andra Git-repositorier som finns i närheten.

Börja från början

Om du inte har spårat dina konfigurationer i ett Git-repositorium tidigare kan du enkelt börja använda den här tekniken med de här raderna:

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
  • Den första raden skapar en mapp ~/.cfg som är ett Git bare repository som kommer att spåra våra filer.
  • Därefter skapar vi ett alias config som vi kommer att använda istället för det vanliga git när vi vill interagera med vårt konfigurationsrepositorium.
  • Vi ställer in en flagga – lokalt för repositoriet – för att dölja filer som vi inte explicit spårar ännu. Detta är så att när du skriver config status och andra kommandon senare, kommer filer som du inte är intresserad av att spåra inte att visas som untracked.
  • Du kan också lägga till aliasdefinitionen för hand i din .bashrc eller använda den fjärde raden som tillhandahålls för enkelhetens skull.

Jag paketerade ovanstående rader till en snippet uppe på Bitbucket och länkade den från en kort-url. Så att du kan ställa in saker och ting med:

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

När du har exekverat installationen kan alla filer inom mappen $HOME versioneras med vanliga kommandon, genom att ersätta git med ditt nyskapade config alias, som t.ex:

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

Installera dina dotfiler på ett nytt system (eller migrera till den här inställningen)

Om du redan lagrar din konfiguration/dotfiler i ett Git-arkiv på ett nytt system kan du migrera till den här inställningen med följande steg:

  • För installationen ska du se till att du har lagt in aliaset i din .bashrc eller .zsh:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Och att ditt källförråd ignorerar mappen där du ska klona den, så att du inte skapar konstiga rekursionsproblem:
echo ".cfg" >> .gitignore
  • Klona nu dina dotfiler till ett obearbetat arkiv i en ”dot”-mapp i din $HOME:
git clone --bare <git-repo-url> $HOME/.cfg
  • Definiera aliaset i det aktuella skalområdet:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Hämta det faktiska innehållet från det nakna arkivet till din $HOME:
config checkout
  • Steget ovan kan misslyckas med ett meddelande som:
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

Detta beror på att mappen $HOME redan kan ha några lagerkonfigurationsfiler som skulle skrivas över av Git. Lösningen är enkel: säkerhetskopiera filerna om du bryr dig om dem, ta bort dem om du inte bryr dig. Jag ger dig en möjlig grov genväg för att flytta alla felande filer automatiskt till en backup-mapp:

mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | \
xargs -I{} mv {} .config-backup/{}
  • Kör utcheckningen på nytt om du hade problem:
config checkout
  • Sätt flaggan showUntrackedFiles till no på detta specifika (lokala) arkiv:
config config --local status.showUntrackedFiles no
  • Du är klar, från och med nu kan du skriva config-kommandon för att lägga till och uppdatera dina dotfiler:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

För att slippa komma ihåg alla dessa steg på varje ny maskin som du vill installera kan du skapa ett enkelt skript, lagra det som Bitbucket snippet som jag gjorde, skapa en kort url för det och kalla det så här:

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

För fullständighetens skull är det här vad jag slutade med (testade på många nyss utvalda Alpine Linux-containrar för att testa det):

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

Slut på det

Jag hoppas att du tycker att den här tekniken är användbar för att spåra din konfiguration. Om du är nyfiken finns mina dotfiles här. Håll kontakten genom att följa @durdn eller mitt grymma team på @atlassiandev.

Lämna ett svar

Din e-postadress kommer inte publiceras.