Wiki/Linux/Dotfiles-sync-git.md

132 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 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](http://www.saintsjd.com/2011/01/what-is-a-bare-git-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](https://bitbucket.org/snippets/nicolapaolucci/ergX9) 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/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](https://www.atlassian.com/de/git) 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](http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/)-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](https://bitbucket.org/snippets/nicolapaolucci/7rE9K), [eine kurze URL dafür erstellen](http://bit.do/) 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](http://www.alpinelinux.org/)):
```
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
```