Dotfiles i bare repository – co to jest i po co
W tym poście chciałbym opisać jak bare rapository może pomóc w zarządaniu i migracji dotfiles. Wypadałoby zacząć od tego czym jest owy dotfile. A więc są to ukryte pliki w których bardzo często przechowywana jest konfiguracja programy, działania powłoki itd. Często edytuje się te pliki aby osiągnąć porządzane działanie, wygląd lub inne funkcje w aplikacji.
W związku z tym im więcej mamy takich zmodyfikowanych konfiguracji tym trudniej jest to utrzymać, a w razie awarii bądź zmiany sprzetu przywrócenie statnu poprzedniego może zająć naprawdę sporo czasu. Jako, że ostanio zawodowo zrobiłem migrację z windowsa do linuksa, problem ten stał się dla mnie ponownie uciążliwy. Mocno zmotywowany postanowiłem poszukać rozwiązania.
Rycerzem na białym koniu okazał się być git, czyli znany prawie każdemu programiście system kontroli wersji. Oczywiście nie tylko porgramiści mogą i powinni używać Gita na codzień. Ciekawym zastosowaniem może być np wersjonowanie prezentacji lub trzymanie różych jej konfiguracji na różnych gałęziach itd. W przypadku plików konfiguracyjnych idealną opcją będzie użycie repozytorim git z flagą bare.
Inicjalizowanie nowego bare repozytorium
git init --bare $HOME/.dotfiles
alias config='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
echo "alias config='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'" >> $HOME/.bashrc
- Inicjalizujemy nasz nowe repozytorium w katalogu .dotfiles
- tworzymy alias, którym będziemy się posługiwać jeżli będziemy chcieli manimulować naszym repozytorium z plikami konfiguracyjnymi
- ustawiamy lokalną flagę aby ukryć wszystkie nieśledzone pliki. Ma to na celu ukryć wszystkie znajdujące się w chwili obecnej pliki w katalogu domowym
- na sam koniec dodajemy nasz alias do pliku .bashrc jeżeli korzystamy z bash’a jako domyślnej powłoki. Dla zsh będzie .zshrc
A więc jak się tym teraz posługiwać? Przeróbmy scenariusz gdy chcemy dodać do naszego repozytorium dwa nowe pliki konfiguracyjne. Będzie to .bashrc i .vimrc
config status
config add .bashrc
config commit -m "Added bashrc file"
config add .vimrc
config commit -m "Add vimrc file"
config push
Korzystamy z naszego repozytorium dokładnie tak samo jak z normalnego gita, z tą różnicą że posługujemy się wcześniej zdefiniowanym aliasem.
- config status – wyświeta nam śledzone i niezakomitowane pliki
- config add filename – dodaje plik/katalog który chcemy dodać do śledzenia
- config commit -m „Message” – commitujemy nasze zmiany i/lub dodane pliki z wiadomością co się wydarzyło w danym commicie
- config push – wysyłamy nasze zakomitowane zmieny na serwer np. https://github.com/ lub https://bitbucket.org/
Przywracanie repozytorium
Jeżeli posiadamy już swoj repozytorium z plikami konfiguracyjnymi, zobaczymy jak możemy je przywrócić np. po zmianie komputera.
- Zaczynamy od skonfigurowania sobie naszego aliasu do prostego posługiwania się repozytorium
alias config='/usr/bin/git --git-dir=$HOME/.dotfiles --work-tree=$HOME'
- Dodajemy katalog w którym znajdować będzie się nasze repozytorium do ignorowanych aby uniknąć problemów związanych z rekurencja
echo ".dotfiles" >> .gitignore
- Pobieramy repozytorium do właściwego katalogu
git clone --bare <git-repo-url> $HOME/.cfg
- Teraz możemy spróbować przełączyć się na repozytorium
config checkout
- Prawdopodobnie dostaniemy błąd podobny do tego poniżej. Wynika to z tego, że nasz katalog domowy zawiera domyślne pliki konfiguracyjne, które chcemy nadpisać.
config checkout
error: The following untracked working tree files would be overwritten by checkout:
.zshrc
Please move or remove them before you switch branches.
Aborting
- Jeżeli się nie boimy, możemy te pliki usnąć lub skorzystać z prostego skryptu który przeniesie je w bezpieczne miejsce.
mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} .config-backup/{}
- Ponawiamy próbę przełączenia się na repozytorium. Tym razem nie powinniśmy mieć problemów.
config checkout
- Dodajemy lokalną flagę aby ukryć wszystkie nieśledzone pliki.
config config --local status.showUntrackedFiles no
I to by było na tyle. W tej chwili możemy zaczać normalną pracę z repozytorium.
Żeby ułatwić sobie życie i przyspieszyć cały proces można to sobie ubrać w ładny skrypt i w zasadzie jednym polecenim załatwić temat importu ustawień. W moim przypadku stowrzyłem sobie GitHub Gist o zawartości
git clone --bare git@github.com:mati-ck/dotfiles.git $HOME/.dotfiles
function config {
/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME $@
}
echo ".dotfiles" >> .gitignore
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
Wywołuję go jednym poleceniem
curl -Lks https://bit.ly/2HLeuTY | /bin/bash
Linkografia: