среда, 16 октября 2013 г.

Некоторые особенности использования hg для /etc/ и /usr/local/etc

Как то на работе  решили попробовать отслеживать изменения настроек серверов. А то админов аж три штуки и серверов куча и каждый админ для своих целей (сервисов) переписывает настройки и других служб. А потом никто не помнит что и зачем делал.
Поэтому взяли и сделали hg init в каталогах типа /etc, /usr/local/etc/ , подключили все это хозяйство к hgserver-у и стали через веб интерфейс смотреть что, когда и зачем менялось. Было принято правило в комментах коммита писать причину сего изменения и имя админа, т.к. зачастую настройки делаются всеми в руте. В общем-то удобно. но оказалось есть свои подводные камни.
Вот они:
 Есть файлы, которые не нужно отслеживать, т.к. они меняются самой системой, например passwd или все, что связано с генерацией ключей и сертификатов. Да мало чего она генерит или исправляет и почему-то разработчики решили, что файлы эти должны лежать именно в /etc/
Нужно их добавить в .hgignore.

Добавление файлов и каталогов в .hgignore в каталогах /etc и /usr/local/etc !

Вроде бы все просто — берешь и добавляешь этот файл или папку в файл .hgignore… Но! Дело в том, что если этот файл или папка уже отслеживалась системой контроля версий (mercurial), то теперь для игнорирования ею этого файла нужно «отписать» этот файл или папку. Для этого в hg  есть команда remove. И вот тут есть подводный камень — т.к. система hg изначально придумана для слежение файлов проектов разрабатываемого ПО, то там не было необходимости переставать следить за файлом и при этом оставлять сам файл в каталоге. Иногда это даже может мешать. И поэтому hg remove УДАЛЯЕТ файл и перестает за ним следить.
В каталогах /etc, /usr/local/etc и т.п. это НЕДОПУСТИМО, поэтому решение такое:
1. Если файл уже отслеживается hg и был изменен (проверить можно командой hg stat, если перед файлом стоит M — то отслеживается), то нужно добавить его в .hgignore, затем копируем в временное место (любое) этот файл или копируем с переименованием файла, после этого делаем hg remove filename (файл при этом удаляется), а затем возвращаем файл обратно (переименовываем обратно).
2. Если файл не отслеживается (hg stat показывает ? перед файлом), то просто добавьте его в .hgignore  и все!
Проверить удачность можно опять же командой hg stat. При удачной операции файл не будет отображаться, это означает что он игнорируется.
Можете коммитить это состояние.

Но учтите, что история удаленного  файла остается в коммитах и если вы решили откатиться на коммит до того, как файл игнорировался, то файл появится в том виде в каком он был на время коммита, на который вы откатили.

Чтобы избежать всей мучительной и возможно неоднократной операции лучше всего перед тем как сделать  hg init тчательно проанализировать все что находится в /etc/ и составить .hgignore заранее. Тогда в коммитах не появится ни одной версии игнорируемых файлов.

 Но мы все люди склонные чего-то не замечать...скорее всего вам потребуется, то что здесь описано :)

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

  1. Кажется не секьюрным :) может без сервера, только локальный репозиторий - тоже можно историю просматривать?

    ОтветитьУдалить
    Ответы
    1. Антон, что то у тебя со знаками препинания :) не совсем читается вопрос. Понятны только первая и последняя фразы:)
      доступ к серверу ограничен по IP :) Кроме того сервер был собран как bare в отдельном каталоге (в нем нет исходников только база .hg) и туда только автоматически пушатся изменения после каждого коммита. Стоит запрет на пуши , разрешено только определенным пользователям. Клоны и пулы наружу закрыты. Вообще сервер имеется ввиду та часть, которая отображает историю в браузере, и то открыта определенным IP адресам.
      Если интересно как это все организовано в целом, могу отдельный пост написать

      Удалить