Простое управление .dotfiles через "bare" репозитории
dotfiles - конфигурационные файлы, чьи названия начинаются с точки (ex: .zshrc, .profile, .config).
Недавно решил перекинуть конфиги с хоста на пару виртуалок, но не хотелось костыльно и долго копировать файлы через расшаренную папку между виртуалками.
tl;dr: и нашёл метод "bare git репозитория". для реализации сначала надо запустить скрипт
инициализации чистого репозитория, после можешь добавить .файлы к отслеживанию, далее commit, пуш, потом уже раскатывай на новой системе ещё одним
скриптом.
Начал изучать как "нормально" управлять .файлами. Наткнулся на
полноценный гайд с всевозможными трюками и туториалами по управлению, среди которых был гайд с использованием "чистых git репозиториев".
По сути, чистые репозитории - это репозитории без рабочего каталога и предназначенные для расшаривания файлов, нежели хранения в конкретном месте.
На том же Github, репозиторий с .файлами, использующий "чистые репозитории" будет выглядить как обычный. Однако, локальный "чистый репозиторий" не будет содержать в себе файлов. Он только знает какие файлы по системе отслеживать.
Благодаря этому подходу не нужно постоянно копировать измененные конфиги в единый локальный репозиторий, чтобы коммитнуть изменения.
Создание чистого репозитория и настройка оболочки
Использую zsh шелл, но если ты bashник, то замени .zshrc на .bashrc
Репозиторий будет в ~/.dotfiles. Для взаимодействия с ним определи алиас "config" и выключи отображение ещё не отслеживаемых файлов, иначе погрязнешь в перечислении файлов домашней директории
```shell
$ git init --bare $HOME/.dotfiles
$ echo "alias config='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'" >> $HOME/.zshrc
$ source .zshrc
$ config config --local status.showUntrackedFiles no
```
Добавление файлов в репозиторий
```shell
$ config status
$ config add .vimrc .zshrc .config/tmux/tmux.conf
$ config commit -m "Add .vimrc, .zshrc and tmux.conf"
$ config remote add origin <remote-repo-url>
$ config push -u origin <branch>
```Если команда "config" не отрабатывает, то проверь применился ли алиас.
Если всё ок и команда успешно запушила репозиторий, то поздравляю с великолепием!
Теперь
git, скрываемый под
config, будет сам подхватывать все изменения в отслеживаемых файлах. Тебе понадобится только коммитить и добавлять в отслеживание новые .файлы
Кроме того, на удаленном репозитории автоматически создатся структура до целевых .файлов, без надобности создавать директории для имитации пути.
Раскатывание .файлов на новой системе
$ echo "alias config='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'" >> $HOME/.zshrc
$ config config --local status.showUntrackedFiles no
$ source $HOME/.zshrc
$ git clone --bare <git-repo-url> $HOME/.dotfiles
$ config checkout
Последняя команда может провалиться из-за существующих конфигов в новой системе. Если текущие конфиги в новой системе
не важны - удаляй их. В противном случае делай бекап. Для удобства пользуйся скриптом от
Atlassian:
```shell
mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} .config-backup/{}
```Теперь пробуй вновь
$ git checkout
Дополнительные заметки
- если в ранее отслеживаемой папки добавились новые файлы, то новый файл или всю директорию понадобится добавить вновь к отслеживанию
- чтобы добавить в удаленный Github репозиторий
README.md или дополнительные файлы, не относящиеся напрямую к dotfiles, то перенеси их в $HOME/.github, после чего добавь в отслеживание саму папку .github
— Github сам распарсит папку .github и отобразит README оттуда на главной странице репозитория
Источники
-
snovvcrash - dotfiles and personalization-
articles, tools and tricks to manage dotfiles-
atlassian - how to manage dotfiles with bare git repo-
мои dotfiles для bspwm, picom, polybar, zsh, tmux и тд#guide