Управление дотфайлами в $HOME с помощью vcsh
Нынешнюю арку о надстройках над Git я хотел бы завершить рассказом о почти
неизвестной1, но весьма крутой программе под названием vcsh.
Расшифровываться это имя может по-разному, но мне больше
всего нравится «version control system for $HOME
» — сразу становится понятно,
что программа предназначена для хранения дотфайлов в системе контроля версий.
Одну из причин, по которым вы можете захотеть хранить свои дотфайлы в СКВ, я уже приводил в начале этой мини-серии. Для полноты картины приведу и вторую (наверное, есть куча дополнительных, но эти две я считаю наиболее важными): благодаря контролю версий у вас появляется возможность синхронизировать конфиги между разными машинами. Лично меня невероятно раздражает, когда я посреди какой-то работы вдруг обнаруживаю, что программы ведут себя не совсем так, как я привык, и всё из-за того, что на текущей машине конфиги чуть старше, чем на предыдущей. Случается такое редко, но меня это в итоге настолько достало, что я решился-таки положить свои конфиги под Git.
В результате появился репозиторий, представляющий из себя кучку дотфайлов
и скрипт, который создавал в $HOME
симлинки. Это было не слишком удобно,
потому что в случае добавления в репозиторий нового дотфайла я должен был не
забыть на всех остальных машинах этот скрипт запустить. Кроме того, мне не
нравилось отсутствие тотальности: репозиторий знал только о тех конфигах,
о которых я позаботился ему сообщить. Если я ставил новую программу, конфиг
которой мне хотелось бы хранить в Git, я должен был не забыть его туда
добавить — сам по себе git status
мне о нём не сообщал. В общем, пользоваться
этим способом можно, но удобств никаких.
vcsh же даёт гораздо менее костыльное и при этом более мощное решение. Он хранит
репозиторий (историю Git) в .config/vcsh/repo.d
, а сами конфиги оставляет
лежать в домашней директории. Это гораздо лучше смотрится в выводе ls
, чем
былое обилие симлинков. Это также даёт возможность разбивать ваши дотфайлы на
несколько наборов, каждый из которых хранится в отдельном репозитории
и клонируется независимо от других2. Выделив свой
.vimrc
в отдельный репозиторий, вы наконец-то сможете везде иметь одинаковую
среду редактирования текста, не таская при этом всякую мишуру вроде настроек
MPlayer и XScreenSaver (она теперь будет в отдельном репозитории).
Кроме того, vcsh рассматривает мой $HOME
как свою рабочую директорию, так что
я получаю желанную «тотальность»: теперь git status
будет сразу сообщать мне
обо всех незнакомых файлах (с учётом .gitignore
, конечно). Ура, ура, ура!
Сейчас мы будем делать что-то, что может повредить ваши данные. Советую закрыть все приложения и сделать бекап дотфайлов, например, вот так:
tar cvjf dotfiles.tbz2 ~/.*
От слов — к делу. Предварительно вернув $HOME
к первозданному виду (чтобы
дотфайлы были файлами, а не симлинками на них), установим vcsh (в Squeeze
придётся подключить backports, в более новых релизах всё уже в main)
и инициализируем репозиторий:
$ cd # вся работа происходит непосредственно в $HOME
$ sudo aptitude install vcsh
$ vcsh init dotfiles
Теперь перейдём в специальный режим, где все вызовы git будут относиться к свежесозданному репозиторию, и добавим в него несколько конфигов:
$ vcsh enter dotfiles
$ git add .vimrc .tmux.conf
$ git commit -m'Initial commit'
Чтобы в выводе git status
вам не мешали обычные файлы, советую добавить
в начало .gitignore
вот такие строки:
* # ignore everything...
!.* # ...but dotfiles
!.*/** # ...and "dotdirs"
Думаю, из комментариев понятно, что именно они делают.
При желании ваш репозиторий можно опубликовать на GitHub (не забудьте предварительно создать его через веб-интерфейс и поменять в команде ниже адрес на тот, который вам сообщит сайт):
$ git remote add origin 'git@github.com:Minoru/dotfiles.git'
$ git push origin master:master
$ git branch --track master origin/master
Выйти из режима, в который мы попали после vcsh enter
, можно с помощью
Ctrl-D
, exit
или просто закрыв окно терминала.
Чтобы не забывать коммитить сделанные изменения, можно добавить в свой crontab
напоминалку, которая будет писать вам на локальное мыло (читается с помощью
mail
):
$ crontab -e
# каждое утро рапортовать о локальных изменениях в репозитории dotfiles
13 7 * * * vcsh dotfiles status --short
Точно так же можно организовать автоматические push
и pull
, но это останется
вам в качестве домашнего задания ☺
На этом обзор базовых возможностей можно считать завершённым. Обязательно
пролистайте /usr/share/doc/vcsh/README.md.gz
— файл хоть и длинный, но
содержит хорошие описания команд и даст вам представление о том, что же умеет
vcsh. До новых встреч!
В феврале 2012-го в своём докладе Ричард Хартманн (Richard Hartmann), разработчик vcsh, сказал, что на данный момент у него десяток-два пользователей (смотрите видео с 09:32). Согласно Debian Popularity Contest, на данный момент vcsh установило почти две с половиной сотни пользователей Debian. Сколько из них действительно пользуются программой, сказать сложно.↩︎
Да, решение с симлинками тоже позволяет такое делать, но мороки в этом случае всё же больше.↩︎
Your thoughts are welcome by email
(here’s why my blog doesn’t have a comments form)