Close

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ären git 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äter config 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:

Datenbanken
Zugehöriges Material

Verschieben eines vollständigen Git-Repositorys

Bitbucket-Logo
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 auf no:
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.

Mitarbeiter arbeiten mit unzähligen Tools zusammen

Bitbucket-Blog

Abbildung: DevOps

DevOps-Lernpfad

Demo Den: Feature-Demos mit Atlassian-Experten

So funktioniert Bitbucket Cloud mit Atlassian Open DevOps

Melde dich für unseren DevOps-Newsletter an

Thank you for signing up