Synchronisierung von .dot Dateien

Haben Sie es satt, die Einstellungen auf verschiedenen Computern manuell zu kopieren? Dieser Artikel zeigt Ihnen, wie Sie Ihre Dotfiles synchronisieren können, damit Ihre Umgebungs- und Anwendungseinstellungen gleich bleiben.

In diesem Artikel geht es darum, wie man mit Dotfiles die Systemeinstellungen auf allen Geräten unverändert beibehält. Mit Git lassen sich durch einfache Schritte alle Einstellungen von Bash-Profilen bis hin zu Anwendungseinstellungen verwalten. Dieser Ansatz gewährleistet ein nahtloses Erlebnis, unabhängig davon, welche Plattform man verwendet.

Wenn Sie es eilig haben, gehen Sie direkt zu Schritt-für-Schritt-Anleitung zur Einrichtung der Dotfile-Synchronisation. Und wenn Sie verstehen wollen, was dort gemacht wird und wofür es gut ist, lesen Sie weiter.

Dot-Dateien (dotfiles) sind Konfigurationsdateien in Unix-ähnlichen Systemen wie macOS, Linux und BSD. Sie speichern Einstellungen für Anwendungen, Werkzeuge und Dienste, die auf Ihrem System laufen, darunter Dinge wie git, ssh, .bashrc, .zshrc, .nanorc, .vimrc und viele andere.

Der Name solcher Dateien beginnt mit einem Punkt (.), um diese Dateien standardmäßig vor dem Benutzer zu verstecken und die Listen der Dateien in Verzeichnissen zu vereinfachen. Und warum sie vor dem Benutzer versteckt sind - lesen Sie die Fußnote unten (zum Öffnen anklicken).

Wie .dot-Dateien zu versteckten Dateien wurden

Diese Geschichte beginnt vor vielen Jahren, als die ersten Dateisysteme in UNIX erstellt wurden. Um eine einfache Navigation zu ermöglichen, wurde jedem Verzeichnis eine Punktdatei (.) hinzugefügt. Und eine weitere Datei mit doppeltem Punkt (..) wurde hinzugefügt, um einfach durch die Verzeichnisstruktur nach oben zu navigieren.

Da diese Dateien keine wirklichen Daten enthielten, wurde ein kleiner Hack in den LS-Befehlscode eingefügt, um diese Dateien vor der Standardausgabe zu verbergen. Es gibt eine vollständige Geschichte dieses Hacks hier, wie aus Faulheit solche versteckten Dateien erstellt werden konnten 😉.

Viele Entwickler teilen ihre Konfigurationsdateien. Du kannst immer Links zu beliebten Repositories mit den Konfigurationsdateien anderer Leute im Internet finden.

Die Synchronisierung von Dotfiles ist für all diejenigen notwendig, die mehrere Computer (und/oder Server) verwenden und auf allen vertraute Umgebungs-, Dienst- und Anwendungseinstellungen haben möchten. Dies erhöht die Produktivität, verkürzt die Einrichtungszeit für neue Rechner und stellt sicher, dass dieselben Werkzeuge und Konfigurationen von Diensten und Anwendungen unabhängig vom verwendeten Computer verfügbar sind.

Vor kurzem musste ich zum Beispiel zwei neue MacBooks hintereinander einrichten. Auf dem Hauptrechner sind alle Einstellungen schon seit langem vorgenommen worden und werden nur selten geändert. Dort habe ich mich bereits an bestimmte Dienstprogramme und Tastenkombinationen gewöhnt, und viele Aktionen werden automatisch ausgeführt. Aber auf dem neuen musste ich alles von Grund auf neu konfigurieren.

Das erste Problem war, sich zu merken, was ich installieren und wie ich es konfigurieren musste, damit mir alles vertraut war. Dann kam das zweite Problem - wie synchronisiert man die Einstellungen von Programmen, und zwar so, dass, wenn sie auf einem Computer geändert werden, all dies automatisch auch auf anderen Computern geändert wird.

Zunächst einmal sollten Sie verstehen, dass die Synchronisierung von absolut allem - installierte Anwendungen und Dienste, deren Einstellungen, Umgebungsvariablen usw. - noch nicht zu 100 % gelöst ist. Es gibt Dinge, die an bestimmte Hardware gebunden sind, und das einfache Kopieren auf einen anderen Computer führt zu einer nicht funktionierenden Anwendung.

Also quälen sich alle weiter mit Ansible, Chef.io, OpenTofu und anderen Tools oder lösen das Problem zumindest mit einfachen Anwendungen. Ich habe bisher auch nur die Synchronisierung für die folgenden Konfigurationsdateien eingerichtet:

  • .gitconfig - Konfiguration für die Arbeit mit Git.
  • .gitignore - welche Dateien ignoriert werden sollen. (👉 .gitignore configurator)
  • .muttrc - Mail im Terminal.
  • .p10k.zsh - Thema für ZSH.
  • .vimrc - Einstellungen für Vim.
  • .zimrc - Module für Zim.
  • .zshrc - ZSH-Einstellungen.

Jede Datei kann jederzeit zur Synchronisation hinzugefügt oder entfernt werden.

Im Internet gibt es unzählige Artikel zu diesem Thema. Eine Liste der sinnvollsten und nützlichsten Artikel, die ich zu diesem Thema gelesen habe, finden Sie ganz am Ende dieses Artikels. Die meisten von ihnen beschreiben die Verwendung verschiedener Versionskontrollsysteme.

Das beliebteste System ist natürlich Git. Auf dem Bild sehen Sie die Marktanteile der verschiedenen Systeme und dass Git der klare Spitzenreiter unter allen ist.

Marktanteile der verschiedenen Versionskontrollsysteme.
Marktanteile der verschiedenen Versionskontrollsysteme.

Link zu aktuellen Informationen: Top 5 Versionskontrolltechnologien.

Was Git und GitHub sind und wie sie sich unterscheiden

Git - ist ein freies und quelloffenes, verteiltes Versionskontrollsystem zur Verfolgung von Änderungen an Dateien, das für die schnelle und effiziente Arbeit mit jedem Projekt - von klein bis sehr groß - entwickelt wurde.

GitHub - ist ein kommerzielles Unternehmen, das Cloud-Hosting für Git-Repositories anbietet. Es ermöglicht einzelnen Enthusiasten und ganzen Teams, Änderungen am Projektcode (Dateien) zu speichern, zu verfolgen und zu kontrollieren.

Einfach ausgedrückt: Sie können Git ohne Github verwenden, aber Sie können GitHub nicht ohne Git verwenden.

Git ist ein beliebtes, bequemes und vertrautes System, also entschied ich mich, es zu verwenden. Bei der Verwendung von Git gibt es zwei gängige Möglichkeiten, Konfigurationsdateien zu synchronisieren - über das übliche Verzeichnis und über das nicht vorhandene Verzeichnis.

Wie kann man die Umgebungseinstellungen über ein normales Verzeichnis synchronisieren? Dazu müssen Sie in Ihrem Home-Verzeichnis ein spezielles Verzeichnis (Ordner) anlegen, in dem alle benötigten Einstellungen und Konfigurationsdateien gespeichert werden. Dann werden symbolische Links für diese Dateien in Ihrem Heimatverzeichnis erstellt.

Im Folgenden werden die einzelnen Schritte zur Einrichtung der Synchronisierung auf diese Weise beschrieben. Alle Befehle werden in der Konsole ausgeführt.

# Wechseln Sie in Ihr Heimatverzeichnis.
cd ~

# Erstellen Sie ein Verzeichnis, um die Konfigurationsdateien zu speichern.
# Der Name kann beliebig sein, ich habe dotfiles verwendet.
mkdir dotfiles

# Verschieben Sie die vorhandenen Konfigurationsdateien in das erstellte Verzeichnis
mv .vimrc .zimrc .zshrc dotfiles/

# Symbolische Links im Home-Verzeichnis erstellen
# -s: diese Option legt einen symbolischen Link an
# -f: überschreibt die Link-Datei ohne Benachrichtigung
ln -sf ~/dotfiles/.vimrc ~/.vimrc
ln -sf ~/dotfiles/.zimrc ~/.zimrc
ln -sf ~/dotfiles/.zshrc ~/.zshrc

In einfachen Worten: die obigen Befehle verschieben Einstellungsdateien in ein spezielles Verzeichnis (dotfiles) und ersetzen sie in Ihrem Home-Verzeichnis durch Links zu ihnen. Wenn ein Programm, wie z.B. vim, versucht, seine Einstellungsdatei zu lesen, die sich standardmäßig in Ihrem Home-Verzeichnis befindet, öffnet es einen Link, der es zur Datei selbst im dotfiles-Verzeichnis führt.

Der nächste Schritt besteht darin, Ihren Browser zu benutzen, um zu Ihrem GitHub zu gehen (wenn Sie noch keines haben, registrieren Sie ein Konto, es ist kostenlos) und dort ein Repository zu erstellen, in dem Sie Ihre Konfigurationsdateien speichern werden. Gehen Sie dann zurück zur Konsole auf Ihrem Computer und navigieren Sie zu dem Verzeichnis dotfiles, das wir erstellt haben

cd dotfiles

Initialisieren Sie es als Git-Verzeichnis:

git init
git add .
git commit -m ‘First commit’
# Ersetzen Sie im folgenden Befehl den Link zu Ihrer Repository-Adresse auf GitHub
git remote add origin https://github.com/YOURNAME/dotfiles
git push origin main

Dieses Verzeichnis ist mit den üblichen Git-Befehlen - status, push, pull usw. - leicht zu bearbeiten. Wenn Sie eine neue Einstellungsdatei für die Synchronisierung hinzufügen müssen, z. B. .nanorc, gehen Sie wie folgt vor:

mv .nanorc dotfiles/
ln -sf ~/dotfiles/.nanorc ~/.nanorc

cd dotfiles
git add .nanorc
git commit -m ‘nanorc-Konfiguration hinzufügen’
git push

WICHTIG! Beachten Sie, dass Git-Befehle innerhalb des Projektverzeichnisses ausgeführt werden, das im Ordner git initialisiert wurde. Die Standard-Git-Logik geht davon aus, dass sich der Arbeitsbaum des Projekts im selben Verzeichnis befindet. Daher müssen Sie jedes Mal in das Verzeichnis dotfiles wechseln, um Aktionen zum Synchronisieren von Dateien durchzuführen (Hinzufügen, Ändern, Herunterladen usw.).

Sie können jedoch optional einen speziellen Alias erstellen, der es Ihnen ermöglicht, Git-Befehle im Verzeichnis dotfiles von überall aus auszuführen, ohne jedes Mal in das Verzeichnis dotfiles wechseln zu müssen. Sie können diesen Alias nennen, wie Sie wollen, ich habe ihn cfg genannt. Hier ist, was Sie tun müssen.

# Erstellen Sie einen Alias mit einem Namen, den Sie sich leicht merken können.
alias cfg='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'

# Speichern Sie sie in den Umgebungseinstellungen, damit wir sie nicht jedes Mal neu erstellen müssen.
echo "alias cfg='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.zshrc

# Und deaktivieren Sie nicht auffindbare Dateien, damit wir die sehen können, die wir sehen wollen.
cfg config --local status.showUntrackedFiles no

Wenn Sie diesen Alias verwenden, sieht der Prozess des Hinzufügens neuer Dateien oder Versionen wie folgt aus:

cd ~
mv .nanorc dotfiles/
ln -sf ~/dotfiles/.nanorc ~/.nanorc

cfg add .nanorc
cfg commit -m ‘nanorc-Konfiguration hinzufügen’
cfg push

Beachten Sie, dass Sie das Verzeichnis dotfiles nicht eingeben müssen - wir haben den Befehl cd dotfiles nicht ausgeführt. Sie können diese Befehle also von überall aus ausführen. Ich möchte Sie noch einmal daran erinnern, dass dieser Schritt völlig optional ist, er dient nur der Bequemlichkeit. Wenn Sie nicht zu faul sind, jedes Mal in das dotfiles-Verzeichnis zu gehen, um die Konfigurationsdateien hinzuzufügen oder zu aktualisieren, brauchen Sie keinen Alias zu erstellen.

Wie synchronisiert man die Einstellungen auf einem anderen Computer?

Jetzt. Um die Einstellungen auf dem anderen Computer mit dem Quellcomputer zu synchronisieren, starten Sie die Konsole und führen Sie die folgenden Befehle aus:

# Wechseln Sie in Ihr Heimatverzeichnis.
cd ~

# Um Rekursionen zu vermeiden, fügen Sie das .cfg-Verzeichnis vorher zu global ignore hinzu
echo ".cfg" >> .gitignore

# Klone dein Repository von GitHub
git clone https://github.com/YOURNAME/dotfiles $HOME/.cfg

# Wenn Sie einen Alias verwenden, speichern Sie ihn in Ihren Umgebungseinstellungen
echo "alias cfg='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.zshrc

# Deaktivieren Sie die Anzeige von nicht verfolgten Dateien.
cfg config --local status.showUntrackedFiles no

# Und verschieben Sie den Inhalt des Repositorys auf einen neuen Computer.
cfg checkout

Möglicherweise erhalten Sie eine Warnung, dass einige der vorhandenen lokalen Dateien wie .bashrc oder .gitignore überschrieben werden könnten. Speichern Sie sie, wenn Sie sie brauchen, oder löschen Sie sie, und wiederholen Sie dann den Befehl cfg checkout. Geschafft!

Einige Benutzer bemerken, dass diese Methode keine negativen Auswirkungen auf die Leistung von anderen Programmen hat.

Der Nachteil ist, dass Sie immer an symbolische Links denken müssen, und dass die Konfigurationsdateien selbst nun in einem speziellen Verzeichnis liegen. Wenn Sie etwas ändern, müssen die Links aktualisiert oder bearbeitet werden. Und wenn kein Bedarf für eine Synchronisierung besteht, müssen Sie die Links löschen und die Dateien selbst an ihren Platz zurückbringen.

Außerdem sollten Sie bedenken, dass einige Anwendungen einfach nicht mit symbolischen Links arbeiten. Sie benötigen nur die ursprünglichen Konfigurationsdateien.

Eine andere Gruppe von Lösungen verwendet die Option --bare beim Erstellen eines Git-Verzeichnisses. Ich habe diese Methode verwendet, weil ich keine Lust hatte, mich mit einem separaten Verzeichnis und symbolischen Links herumzuschlagen. Obwohl alles automatisiert ist, fand ich diese Methode eleganter und bequemer.

👉 Ich werde hier nicht ins Detail gehen, aber Sie können den Unterschied zwischen regulären und bare Katalogen in dieser informativen Frage What’s the practical difference between a Bare and non-Bare repository? auf StackOverflow nachlesen.

Was muss ich also tun, um die Dotfile-Synchronisierung mit der Bare-Directory-Methode einzurichten? Führen Sie dazu die folgenden Schritte aus.

# Wechseln Sie in Ihr Heimatverzeichnis.
cd ~

# Erstellen Sie ein reines Git-Repository in Ihrem Heimatverzeichnis.
git init --bare $HOME/.cfg
alias cfg='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
cfg config --local status.showUntrackedFiles no
echo "alias cfg='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.zshrc

Wenn Sie die Synchronisierung von Punktdateien einrichten, müssen Sie die Sicherheit im Auge behalten. Manchmal können Konfigurationsdateien sensible Daten wie Zugriffsschlüssel und Kennwörter enthalten. Hier sind einige einfache Tipps, die Ihnen helfen, Ihre Dot-Dateien zu schützen:

  1. Private Repositories: Wenn Sie GitHub oder eine andere Plattform zum Speichern Ihrer Dot-Dateien verwenden, stellen Sie sicher, dass das Repository privat ist. Dies wird dazu beitragen, dass Unbefugte keinen Zugriff auf Ihre Konfigurationsdateien haben.

  2. Datenverschlüsselung: Fügen Sie keine Dateien mit Passwörtern, API-Schlüsseln, privaten SSH-Schlüsseln und anderen sensiblen Informationen zu Ihrem Repository hinzu. Für solche Daten ist es besser, spezielle Geheimnisverwalter zu verwenden, wie git-crypt oder SOPS oder GPG.

  3. Reguläre Überprüfungen: Überprüfen Sie regelmäßig, wer Zugang zu Ihrem Repository hat und aktualisieren Sie Passwörter und Schlüssel. So schützen Sie Ihre Daten vor unberechtigtem Zugriff.

  4. Verwenden Sie SSH-Schlüssel: Verbinden Sie sich mit entfernten Servern und Repositories mit SSH-Schlüsseln anstelle von Passwörtern. Dadurch wird die Sicherheit Ihrer Verbindungen erhöht.

  5. Zugangsbeschränkungen: Stellen Sie sicher, dass nur diejenigen, die wirklich auf Ihre Dot-Dateien zugreifen müssen, Zugang haben. Aktivieren Sie die Zwei-Faktoren-Authentifizierung für zusätzlichen Schutz.

Abschließend möchte ich noch ein paar Punkte ansprechen.

Erstens sollten Sie sich nur dann mit der Synchronisierung befassen, wenn Sie mehr als zwei Server/Computer haben, für die es wichtig ist, die gleichen Werkzeuge und Einstellungen zu haben. Andernfalls macht es mehr Mühe, als es wert ist. Zweitens: Versuchen Sie zu verstehen, was genau Sie synchronisieren müssen. Wenn es sich nur um ein oder zwei Dienstprogramme handelt, lohnt es sich vielleicht auch nicht. Und vergessen Sie die Sicherheit nicht!

Als ich anfing, dotfile sync einzurichten, erschien es mir sehr kompliziert. Sobald ich alles eingerichtet und die Dienstbefehle gelernt hatte, war es schnell und einfach. Es funktioniert großartig, in meinem Fall hat sich der Aufwand also gelohnt.

Nach einiger Zeit habe ich jedoch festgestellt, dass ich viel häufiger einen neuen Server oder einen neuen Computer einrichten muss, als dass ich Einstellungen ändern muss. Und das ist eine ganz andere Geschichte, die eine etwas andere Herangehensweise und ein anderes Toolset erfordert. Ich recherchiere bereits eine andere Reihe von Informationen zu diesem Thema, und es gibt einige sehr interessante Ergebnisse. Wie immer plane ich, die Erfahrungen kluger Leute zusammenzufassen und zu vereinfachen und das alles in meinem Blog zu veröffentlichen, also schauen Sie wieder vorbei.

Hier ist eine Liste von Materialien, die ich durchforsten musste, um das Thema zu verstehen.

Viel Glück und wenn Sie Fragen haben, kontaktieren Sie mich über einen der Kanäle.

😎