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 StreakyCobra
zeigte 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/.bashrc
- Die 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ärengit
verwenden, 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 verfolgt
angezeigt, wenn du späterconfig status
und andere Befehle eingibst. - Du kannst die Aliasdefinition auch von Hand zu deiner
.bashrc
hinzufü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:
Zugehöriges Material
Verschieben eines vollständigen Git-Repositorys
Lösung anzeigen
Git kennenlernen mit Bitbucket Cloud
curl -Lks http://bit.do/cfg-init | /bin/bash
Nachdem 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 push
Installation deiner Punktdateien 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
.bashrc
oder.zsh
committet 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" >> .gitignore
- Klone nun deine Punktdateien in ein Bare-Repository in einem "Punkt"-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'
- Checke den eigentlichen Inhalt aus dem Bare-Repository in deinen
$HOME
-Ordner aus:
config checkout
- Der 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.
Aborting
Dies 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 checkout
- Setze das Flag
showUntrackedFiles
in diesem spezifischen (lokalen) Repository aufno
:
config config --local status.showUntrackedFiles no
- Nun 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 push
Um 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/bash
Der 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 no
Abschluss
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.
Diesen Artikel teilen
Nächstes Thema
Lesenswert
Füge diese Ressourcen deinen Lesezeichen hinzu, um mehr über DevOps-Teams und fortlaufende Updates zu DevOps bei Atlassian zu erfahren.