12 июня 2013 г.

Хранение конфигурационных файлов (RCS & Git)

Когда-то давным давно, я впервые познакомился с системами контроля версий. Наверное это была CVS. Git'а тогда еще в планах думаю не было. Возникла у меня примерно в то далекое время логичная идея хранить все настройки в какой-нибудь подобной системе. Так совпало, что тогда же я активно изучал Emacs. И наткнулся тагда я на Version Control расширение. Именно оттуда я узнал о более древней системе: RCS. Как ни странно, именно в эту систему Emacs предлагает добавить файлы по умолчанию (C-x v v).

Так вот, с тех давних пор у меня все хранилось в RCS. Вообще говоря это достаточно удобно, если единственная задача: хранить историю изменений на одной машине. Все управление через Emacs. Я даже не особо знаю ключи команд ci и co.

Теперь же у меня фактически 4 компьютера, на которых я хотел бы иметь одинаковые, хотя бы, пользовательские настройки. Например, для bash или того же git. Для этого я задумал поместить все необходимые файлы из домашней директории в git репозиторий. Но положить в git всю или часть домашней директории похоже нехорошая идея. Однозначно будут глюки с git prompt. Если не добавить все файлы в .gitignore, то git prompt просто подвесит консоль: сканирование всей домашней директории не быстрое дело. Думаю это не единственная проблема.

Я решил воспользоваться следующей схемой. Нужные файлы скопировать в специальную папочку. В ней организовать git репозиторий. А в домашней директории создать ссылки на файлы из этой папки. Для автоматизации последней задачи я написал небольшой скриптик. Когда доработаю, выложу на github.

Еще одна проблема: специфичные настройки определенных машин. Например, PATH в Linux и OS X местами различаются (избыточности не хочется). В .gitconfig у меня даже различие есть. Для решения этого вопроса я создал для каждой машины, которой необходимы какие-то особенности, специальную ветку. Общие настройки хранятся на master ветке. Неудобство этой схемы связанно с тем, что надо постоянно сливать изменения с master'а в специфичные ветки. Может есть какое-то более простое и элегантное решение?

Ну а системные настройки (/etc/) я так и продолжаю хранить в RCS. Если будет задача настройки нескольких одинаковых машин, то можно будет подумать на тему синхронизации через git. Пока это не нужно. RCS хранит историю и этого достаточно. Насколько знаю portage в gentoo можно настроить для сохранения истории в RCS (см. /etc/dispatch-conf.conf). Но сам я этой возможностью не пользуюсь. Что-то там не состыковывается с моими привычками.

2 комментария:

Murz комментирует...

А пробовали использовать какое-нибудь прложение специально для таких целей, например Puppet? Вроде бы они как раз для этого и предназначены - синхронизировать настройки между компами...

Я сам ещё не использовал, пока ручками копирую, но собираюсь в ближайшем будущем заморочиться на эту тему ;)

Murz комментирует...

Вот тут статейка с его описанием: http://habrahabr.ru/post/67471/