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

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

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

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

## Настройка

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

```bash
git init --bare $HOME/.cfg
```

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

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

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

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

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

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

```bash
home config --local status.showUntrackedFiles no
```

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

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

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

```fish
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`.

[^1]: [bobuk](https://paragraph.com/@bobuk/git-home-config) - более подробный вариант этой статьи.
[^2]: [atlassian](https://www.atlassian.com/git/tutorials/dotfiles) - то же самое, но на английском.
[^fish]: Мой основной shell - fish, функция приведена именно для него. Для своего шелла попросите
переписать агента ;)
