Disclaimer: der Titel ist etwas übertrieben, es gibt andere bewährte Lösungen für das Problem. Ich denke aber, dass die untenstehende Technik sehr elegant ist.

Kürzlich las ich über diese erstaunliche Technik in einem Hacker News Thread über die Lösungen der Leute, ihre Dotfiles zu speichern. Benutzer StreakyCobra zeigte seinen eleganten Aufbau und … Es machte so viel Sinn! Ich bin gerade dabei, mein eigenes System auf die gleiche Technik umzustellen. Die einzige Voraussetzung ist die Installation von Git.

In seinen Worten erfordert die folgende Technik:

Keine zusätzlichen Werkzeuge, keine Symlinks, die Dateien werden in einem Versionskontrollsystem verfolgt, man kann verschiedene Zweige für verschiedene Computer verwenden, man kann seine Konfiguration bei einer neuen Installation einfach replizieren.

Die Technik besteht darin, ein Git-Bare-Repository in einem „Nebenordner“ (wie $HOME/.cfg oder $HOME/.myconfig) zu speichern und dabei einen speziell erstellten Alias zu verwenden, so dass Befehle gegen dieses Repository ausgeführt werden und nicht gegen den üblichen lokalen Ordner .git, der alle anderen Git-Repositories in der Umgebung beeinträchtigen würde.

Von Grund auf neu beginnen

Wenn Sie Ihre Konfigurationen noch nie in einem Git-Repository verfolgt haben, können Sie mit dieser Technik ganz einfach beginnen:

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
  • Die erste Zeile erstellt einen Ordner ~/.cfg, der ein Git-Bare-Repository ist, das unsere Dateien verfolgt.
  • Dann erstellen wir einen Alias config, den wir anstelle des regulären git verwenden werden, wenn wir mit unserem Konfigurations-Repository interagieren wollen.
  • Wir setzen ein Flag – lokal im Repository – um Dateien auszublenden, die wir noch nicht explizit verfolgen. Wenn Sie später config status und andere Befehle eingeben, werden die Dateien, die Sie nicht verfolgen wollen, nicht als untracked angezeigt.
  • Sie können die Alias-Definition auch von Hand in Ihr .bashrc einfügen oder die vierte Zeile verwenden, die der Einfachheit halber zur Verfügung gestellt wird.

Ich habe die obigen Zeilen in ein Snippet auf Bitbucket gepackt und es über eine Kurzurl verlinkt. Damit kannst du die Dinge einrichten:

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

Nachdem du das Setup ausgeführt hast, kann jede Datei innerhalb des $HOME-Ordners mit normalen Befehlen versioniert werden, indem du git durch deinen neu erstellten config-Alias ersetzt, wie:

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

Installieren Sie Ihre Dotfiles auf einem neuen System (oder migrieren Sie zu diesem Setup)

Wenn Sie Ihre Konfiguration/Dotfiles bereits in einem Git-Repository speichern, können Sie auf einem neuen System mit den folgenden Schritten zu diesem Setup migrieren:

  • Vor der Installation stellen Sie sicher, dass Sie den Alias in Ihr .bashrc oder .zsh übertragen haben:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Und stellen Sie sicher, dass Ihr Quell-Repository den Ordner ignoriert, in den Sie es klonen werden, damit Sie keine seltsamen Rekursionsprobleme verursachen:
echo ".cfg" >> .gitignore
  • Jetzt klone deine Dotfiles in ein blankes Repository in einem „Dot“-Ordner deines $HOME:
git clone --bare <git-repo-url> $HOME/.cfg
  • Definiere den Alias im aktuellen Shell-Bereich:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Auschecken des aktuellen Inhalts aus dem Bare Repository in Ihr $HOME:
config checkout
  • Der obige Schritt könnte mit einer Meldung wie dieser fehlschlagen:
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

Das liegt daran, dass Ihr $HOME-Ordner möglicherweise bereits einige Bestandskonfigurationsdateien enthält, die von Git überschrieben werden würden. Die Lösung ist einfach: Sichern Sie die Dateien, wenn sie Ihnen wichtig sind, entfernen Sie sie, wenn sie Ihnen egal sind. Ich stelle Ihnen eine mögliche grobe Abkürzung zur Verfügung, um alle beanstandeten Dateien automatisch in einen Sicherungsordner zu verschieben:

mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | \
xargs -I{} mv {} .config-backup/{}
  • Führen Sie das Auschecken erneut durch, wenn Sie Probleme hatten:
config checkout
  • Setzen Sie das Flag showUntrackedFiles auf no für dieses spezielle (lokale) Repository:
config config --local status.showUntrackedFiles no
  • Sie sind fertig, von nun an können Sie config Befehle eingeben, um Ihre Punktdateien hinzuzufügen und zu aktualisieren:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Auch als Abkürzung, um sich nicht an all diese Schritte auf jeder neuen Maschine, die Sie einrichten wollen, erinnern zu müssen, können Sie ein einfaches Skript erstellen, es als Bitbucket-Snippet speichern, wie ich es getan habe, eine kurze URL dafür erstellen und es wie folgt aufrufen:

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

Der Vollständigkeit halber ist das, was ich am Ende hatte (getestet auf vielen frisch geprägten Alpine Linux Containern, um es auszuprobieren):

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

Zusammenfassung

Ich hoffe, Sie finden diese Technik nützlich, um Ihre Konfiguration zu verfolgen. Wenn Sie neugierig sind, finden Sie meine Dotfiles hier. Bitte bleiben Sie auch in Verbindung, indem Sie @durdn oder meinem großartigen Team bei @atlassiandev folgen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.