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łegogit
, 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 jakountracked
. - 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
nano
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.