Git home config

Небольшая воскресная заметка про то, как я храню свои dotfiles.

Скорее всего, у вас осознание надобности резервных копий .config/* появилось, как и у меня, - когда после очередного эксперимента vim начал не так радостно бибикать, а ⌘+z не помогает.

Первым делом после восстановления исходной версии конфигов вы наверняка побежите гуглить, какие есть способы хранения конфигов, чтоб больше ничего не проэтовать. И с большой степенью вероятности наткнетесь на кучу сложного софта по типу nix, gnu stow, dotbot и т. п. В целом это хорошие инструменты, но, как всегда, можно проще.

Скрывать не буду, подглядел этот метод у bobuk’а1 и atlassian2. Суть в том, что можно хранить все в привычном git-репозитории, который предварительно немного настроили.

Настройка #

Для начала надо инициализировать репу:

git init --bare $HOME/.cfg

.cfg используется специально, чтобы ничего случайно не закоммитить.

Так как git будет пытаться отслеживать все файлы в $HOME, лучше добавить настройку в конфиг репозитория:

Теперь создаем самый главный alias:

alias home='git --work-tree=$HOME --git-dir=$HOME/.cfg'

Этот алиас делает две вещи. Во-первых, он указывает гиту использовать ваш домашний каталог как рабочую директорию. Во-вторых, он указывает гиту использовать каталог .cfg в вашем домашнем каталоге как каталог с репозиторием. Отслеживаться будут только файлы, которые вы явно добавите через home add.

Но по умолчанию home status будет вываливать все неотслеживаемые файлы из $HOME, кроме игнорируемых. Чтобы не смотреть на весь этот зоопарк, отключаем их показ:

home config --local status.showUntrackedFiles no

Для первого коммита, например, добавим конфиг fish:

home add "$HOME/.config/fish/config.fish"
home commit -m 'Add fish config'

На этом, собственно, все. Вы можете управлять добавленными конфигами в хомяке через гит, используя привычные команды, только с home вместо git. Я для удобства сделал еще один alias для lazygit:

function lazyhome --wraps='lazygit -g ~/.cfg -w ~' --description 'alias lazyhome lazygit -g ~/.cfg -w ~'
    lazygit -g ~/.cfg -w ~ $argv
end

Правда, репа на том же диске не спасет, если диск умрет. Для резервной копии добавьте удаленный репозиторий через home remote add origin <URL> и отправляйте туда коммиты через home push -u origin HEAD.