Disclaimer: titlen er lidt hyperbolisk, der er andre gennemprøvede løsninger på problemet. Jeg synes dog, at nedenstående teknik er meget elegant.

For nylig læste jeg om denne fantastiske teknik i en Hacker News-tråd om folks løsninger til at gemme deres dotfiles. Bruger StreakyCobra viste sin elegante opsætning og … Det gav så meget mening! Jeg er i gang med at skifte mit eget system til den samme teknik. Den eneste forudsætning er at installere Git.

Med hans ord kræver nedenstående teknik:

Ingen ekstra værktøj, ingen symlinks, filer spores på et versionsstyringssystem, du kan bruge forskellige grene til forskellige computere, du kan replikere din konfiguration nemt på ny installation.

Teknikken består i at gemme et Git nøgent repository i en “side” mappe (som $HOME/.cfg eller $HOME/.myconfig) ved hjælp af et specielt udformet alias, så kommandoer køres mod dette repository og ikke den sædvanlige .git lokale mappe, hvilket ville forstyrre alle andre Git repositories i nærheden.

Starter fra bunden

Hvis du ikke har sporet dine konfigurationer i et Git-repositorium før, kan du nemt begynde at bruge denne teknik med disse linjer:

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ørste linje opretter en mappe ~/.cfg, som er et Git nøgent repositorium, der vil spore vores filer.
  • Dernæst opretter vi et alias config, som vi vil bruge i stedet for det almindelige git, når vi ønsker at interagere med vores konfigurationsrepositorium.
  • Vi sætter et flag – lokalt for repositoriet – for at skjule filer, som vi ikke eksplicit sporer endnu. Dette er så, at når du skriver config status og andre kommandoer senere, vil filer, du ikke er interesseret i at spore, ikke blive vist som untracked.
  • Du kan også tilføje aliasdefinitionen i hånden til din .bashrc eller bruge den fjerde linje, der er medtaget for nemheds skyld.

Jeg pakkede ovenstående linjer i et snippet oppe på Bitbucket og linkede det fra en short-url. Så du kan sætte tingene op med:

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

Når du har udført opsætningen kan enhver fil i $HOME-mappen versioneres med normale kommandoer, idet du erstatter git med dit nyoprettede config-alias, som f.eks:

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

Installer dine dotfiler på et nyt system (eller migrér til denne opsætning)

Hvis du allerede gemmer din konfiguration/dine dotfiler i et Git-repositorium, kan du på et nyt system migrere til denne opsætning med følgende trin:

  • Før installationen skal du sikre dig, at du har commitet aliaset til dit .bashrc eller .zsh:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Og at dit kildeoplag ignorerer den mappe, hvor du vil klone den, så du ikke skaber underlige rekursionsproblemer:
echo ".cfg" >> .gitignore
  • Klonér nu dine dotfiler til et nøgent repository i en “dot”-mappe i din $HOME:
git clone --bare <git-repo-url> $HOME/.cfg
  • Definér aliaset i det aktuelle shell-scope:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Hent det faktiske indhold fra det nøgne arkiv til din $HOME:
config checkout
  • Strædet ovenfor kan mislykkes med en meddelelse som: $HOME:
config checkout
  • Det kan mislykkes med en meddelelse 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

Dette skyldes, at din $HOME-mappe måske allerede har nogle lagerkonfigurationsfiler, som ville blive overskrevet af Git. Løsningen er enkel: sikkerhedskopier filerne, hvis du er ligeglad med dem, fjern dem, hvis du er ligeglad. Jeg giver dig en mulig grov genvej til at flytte alle de ulovlige filer automatisk til en sikkerhedskopimappe:

mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | \
xargs -I{} mv {} .config-backup/{}
  • Genkør udtjekningen igen, hvis du havde problemer:
config checkout
  • Sæt flaget showUntrackedFiles til no på dette specifikke (lokale) repository:
config config --local status.showUntrackedFiles no
  • Du er færdig, fra nu af kan du nu skrive config-kommandoer for at tilføje og opdatere dine dotfiler:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Men som en genvej til ikke at skulle huske alle disse trin på enhver ny maskine, du ønsker at opsætte, kan du oprette et simpelt script, gemme det som Bitbucket snippet som jeg gjorde, oprette en kort url til det og kalde det som dette:

config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push
curl -Lks http://bit.do/cfg-install | /bin/bash

For fuldstændighedens skyld er dette, hvad jeg endte med (testet på mange nyligt udmøntede Alpine Linux-containere for at afprøve 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

Wrapping up

Jeg håber du finder denne teknik nyttig til at spore din konfiguration. Hvis du er nysgerrig, bor mine dotfiles her. Du må også gerne holde forbindelsen ved at følge @durdn eller mit fantastiske team på @atlassiandev.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.