Zastrzeżenie: tytuł jest nieco hiperboliczny, istnieją inne sprawdzone rozwiązania tego problemu. Myślę jednak, że poniższa technika jest bardzo elegancka.

Ostatnio przeczytałem o tej niesamowitej technice w wątku Hacker News na temat rozwiązań ludzi do przechowywania ich dotfiles. Użytkownik StreakyCobra pokazał swoją elegancką konfigurację i … To miało tak wiele sensu! Jestem w trakcie przełączania mojego własnego systemu do tej samej techniki. Jedynym warunkiem wstępnym jest zainstalowanie Git.

W jego słowach poniższa technika wymaga:

Bez dodatkowych narzędzi, bez symlinków, pliki są śledzone w systemie kontroli wersji, możesz używać różnych gałęzi dla różnych komputerów, możesz łatwo replikować konfigurację na nowej instalacji.

Ta technika polega na przechowywaniu gołego repozytorium Git w „bocznym” folderze (jak $HOME/.cfg lub $HOME/.myconfig) przy użyciu specjalnie spreparowanego aliasu, tak że polecenia są uruchamiane przeciwko temu repozytorium, a nie zwykłemu folderowi lokalnemu .git, który kolidowałby z innymi repozytoriami Git w pobliżu.

Zaczynając od zera

Jeśli nie śledziłeś wcześniej swoich konfiguracji w repozytorium Git, możesz łatwo zacząć używać tej techniki dzięki tym liniom:

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
  • Pierwsza linia tworzy folder ~/.cfg, który jest gołym repozytorium Git, które będzie śledzić nasze pliki.
  • Następnie tworzymy alias config, którego będziemy używać zamiast zwykłego git, gdy będziemy chcieli wejść w interakcję z naszym repozytorium konfiguracyjnym.
  • Ustawiamy flagę – lokalną dla repozytorium – aby ukryć pliki, których jeszcze nie śledzimy. Dzięki temu, gdy wpiszesz config status i inne polecenia później, pliki, których nie chcesz śledzić, nie będą wyświetlane jako untracked.
  • Możesz również dodać definicję aliasu ręcznie do swojego .bashrc lub użyć czwartej linii podanej dla wygody.

Pakowałem powyższe linie w snippet na Bitbucket i połączyłem go z short-url. Tak, że można skonfigurować rzeczy z:

curl -Lks http://bit.do/cfg-init | /bin/bash

Po wykonaniu konfiguracji każdy plik w folderze $HOME może być wersjonowany za pomocą normalnych poleceń, zastępując git swoim nowo utworzonym config aliasem, jak:

config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Zainstaluj swoje dotfile na nowym systemie (lub zmigruj do tej konfiguracji)

Jeśli już przechowujesz swoją konfigurację/dotfile w repozytorium Git, na nowym systemie możesz zmigrować do tej konfiguracji wykonując następujące kroki:

  • Przed instalacją upewnij się, że popełniłeś alias do swojego .bashrc lub .zsh:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • I że twoje repozytorium źródłowe ignoruje folder, w którym go sklonujesz, aby nie tworzyć dziwnych problemów z rekurencją:
echo ".cfg" >> .gitignore
  • Teraz sklonuj swoje dotfiles do gołego repozytorium w folderze „dot” twojego $HOME:
git clone --bare <git-repo-url> $HOME/.cfg
  • Zdefiniuj alias w bieżącym zakresie powłoki:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Wykasuj rzeczywistą zawartość z gołego repozytorium do swojego $HOME:
config checkout
  • Krok powyżej może zakończyć się niepowodzeniem z komunikatem takim jak:
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

Dzieje się tak dlatego, że twój folder $HOME może już zawierać pewne pliki konfiguracyjne zasobów, które zostałyby nadpisane przez Git. Rozwiązanie jest proste: zrób kopię zapasową plików, jeśli ci na nich zależy, usuń je, jeśli cię to nie interesuje. Podaję ci możliwy zgrubny skrót, aby przenieść wszystkie obraźliwe pliki automatycznie do folderu kopii zapasowej:

mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | \
xargs -I{} mv {} .config-backup/{}
  • Ponownie uruchom sprawdzanie, jeśli miałeś problemy:
config checkout
  • Ustaw flagę showUntrackedFiles na no na tym konkretnym (lokalnym) repozytorium:
config config --local status.showUntrackedFiles no
  • Skończyłeś, od teraz możesz już wpisywać config polecenia, aby dodawać i aktualizować swoje pliki dotfiles:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Znowu jako skrót, aby nie musieć pamiętać tych wszystkich kroków na każdej nowej maszynie, którą chcesz skonfigurować, możesz stworzyć prosty skrypt, przechowywać go jako Bitbucket snippet, tak jak ja to zrobiłem, utworzyć dla niego krótki adres url i nazwać go w ten sposób:

curl -Lks http://bit.do/cfg-install | /bin/bash

Dla kompletności to jest to, z czym skończyłem (przetestowane na wielu świeżo wybitych kontenerach Alpine Linux, aby to przetestować):

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 ; then
echo "Checked out config.";
else
echo "Backing up pre-existing dot files.";
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles no

Wrapping up

Mam nadzieję, że uznasz tę technikę za przydatną do śledzenia swojej konfiguracji. Jeśli jesteś ciekawy, moje pliki dotfiles żyją tutaj. Proszę również pozostać w kontakcie poprzez śledzenie @durdn lub mojego wspaniałego zespołu w @atlassiandev.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.