Punktdateien: So speicherst du sie in einem Bare-Git-Repository am besten
Disclaimer: Der Titel ist leicht übertrieben, es gibt auch andere bewährte Lösungen für das Problem. Ich denke jedoch, dass die folgende Technik sehr elegant ist.
Kürzlich habe ich in einem Hacker News-Thread über Lösungen zum Speichern von Punktdateien von dieser erstaunlichen Technik gelesen. Der Benutzer StreakyCobrazeigte sein elegantes Setup und … es war absolut sinnvoll! Ich bin gerade dabei, mein eigenes System auf dieselbe Technik umzustellen. Die einzige Voraussetzung ist die Installation von Git.
In seinen Worten erfordert diese Technik:
Keine zusätzlichen Tools, keine Symlinks, Dateien werden auf einem Versionskontrollsystem verfolgt, für verschiedene Rechner können verschiedene Branches verwendet werden, deine Konfiguration ist bei einer Neuinstallation problemlos replizierbar.
Bei dieser Technik wird ein Git-Bare-Repository in einem "Seiten"-Ordner (wie $HOME/.cfg. oder $ HOME/.myconfig) unter Verwendung eines speziell erstellten Alias gespeichert, sodass Befehle für dieses Repository ausgeführt werden und nicht für den üblichen lokalen .git-Ordner, der andere Git-Repositorys in der Umgebung stören würde.
Kompletter Neueinstieg
Wenn du deine Konfigurationen noch nicht in einem Git-Repository verfolgt hast, kannst diese Technik einfach mit diesen Zeilen verwenden:
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/.bashrcDie erste Zeile erstellt den Ordner
~/.cfg, der ein Git-Bare-Repository ist, das unsere Dateien verfolgt.Dann erstellen wir eine Alias-
config, die wir anstelle des regulärengitverwenden, wenn wir mit unserem Konfigurations-Repository interagieren möchten.Wir setzen lokal für das Repository ein Flag, um Dateien auszublenden, die wir noch nicht explizit verfolgen. Auf diese Weise werden Dateien, die du nicht verfolgen möchtest, nicht als
nicht verfolgtangezeigt, wenn du späterconfig statusund andere Befehle eingibst.Du kannst die Aliasdefinition auch von Hand zu deiner
.bashrchinzufügen oder die vierte Zeile verwenden, die der Einfachheit halber zur Verfügung gestellt wird.
Ich habe die obigen Zeilen in ein Snippet in Bitbucket gepackt und über eine kurze URL verlinkt. Auf diese Weise kannst du hiermit deine Einrichtung vornehmen:
curl -Lks http://bit.do/cfg-init | /bin/bashNachdem du die Einrichtung ausgeführt hast, kann jede Datei im $HOME-Ordner mit normalen Befehlen versioniert werden, wobei git durch deinen neu erstellten config-Alias ersetzt wird, wie z. B.:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config pushInstallation deiner Dotfiles auf einem neuen System (oder Migration zu diesem Setup)
Wenn du deine Konfigurations-/Punktdateien bereits in einem Git-Repository aufbewahrst, kannst du auf einem neuen System mit den folgenden Schritten zu dieser Einrichtung migrieren:
Vergewissere dich vor der Installation, dass du den Alias für deine
.bashrcoder.zshcommittet hast:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'Dein Quell-Repository muss den Ordner ignorieren, in dem du es klonen wirst, damit keine seltsamen Rekursionsprobleme verursacht werden:
echo ".cfg" >> .gitignoreKlone nun deine Punktdateien in ein Bare-Repository in einem "Punkt"-Ordner deines
$HOME:
git clone --bare <git-repo-url> $HOME/.cfgDefiniere den Alias im aktuellen Shell-Bereich:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'Checke den eigentlichen Inhalt aus dem Bare-Repository in deinen
$HOME-Ordner aus:
config checkoutDer obige Schritt schlägt möglicherweise mit einer Meldung wie folgt fehl:
error: The following untracked working tree files would be overwritten by checkout:
.bashrc
.gitignore
Please move or remove them before you can switch branches.
AbortingDies liegt daran, dass dein $HOME-Ordner möglicherweise bereits einige Standardkonfigurationsdateien enthält, die von Git überschrieben würden. Die Lösung ist einfach: Sichere die Dateien, wenn sie dir wichtig sind, und entferne sie, wenn sie nicht von Bedeutung sind. Mit dem folgenden Shortcut kannst du alle störenden Dateien automatisch in einen Sicherungsordner verschieben:
mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} .config-backup/{}Führe das Auschecken erneut durch, wenn du Probleme hattest:
config checkoutSetze das Flag
showUntrackedFilesin diesem spezifischen (lokalen) Repository aufno:
config config --local status.showUntrackedFiles noNun bist du fertig und kannst ab jetzt
config-Befehle eingeben, um deine 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 pushUm dich nicht an all diese Schritte erinnern zu müssen, wenn du einen neuen Rechner einrichten möchtest, kannst du ein einfaches Skript erstellen, es wie ich als Bitbucket-Snippet speichern, eine kurze URL dafür erstellen und es so aufrufen:
curl -Lks http://bit.do/cfg-install | /bin/bashDer Vollständigkeit halber habe ich das gemacht (getestet auf vielen frischgebackenen Alpine Linux-Containern):
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 [ $? = 0 ]; then
echo "Checked out config.";
else
echo "Backing up pre-existing dot files.";
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles noAbschluss
Ich hoffe, du findest diese Technik nützlich, um deine Konfiguration zu verfolgen. Wenn du neugierig bist: Hier befinden sich meine Punktdateien. Bitte bleib in Verbindung, indem du @durdn oder meinem großartigen Team unter @atlassiandev folgst.
Für dich empfohlen
Bitbucket-Blog
DevOps-Lernpfad
Weitere Informationen zu Git
Weitere Git-Anleitungen und Ressourcen findest du in diesem Hub.