Раньше мы обновляли конфигурацию Nagios через SVN, при этом пользователи фиксировали свои изменения, а скрипт запускался каждые 15 минут. Сценарий проверил наличие обновлений, затем проверил эти обновления, проанализировал проверку конфигурации, затем перезагрузил конфигурацию. Красиво и просто, отлично справился со своей задачей.
Недавно мы перешли на GIT в рамках более широкой миграции на GIT для других проектов, и мне трудно доработать этот скрипт для соответствия.
Вот оригинальная версия SVN:
cd /usr/local/nagios
RESULT=`svn update | grep Updated | wc -l`
echo $RESULT
if [ "$RESULT" != "0" ]; then
/etc/init.d/nagios reload
fi
cd -
И вот мои лучшие попытки с GIT:
cd /usr/local/nagios
RESULT=`git pull 2>&1 | grep Unpacking | wc -l`
echo $RESULT
if [ "$RESULT" != "0" ]; then
/etc/init.d/nagios reload
fi
cd -
Проблема, с которой я столкнулся, заключается в том, что я не могу получить анализируемый вывод, чтобы я мог сопоставить его. Я подумал о том, чтобы пойти другим путем, проверив самую последнюю фиксацию в локальной рабочей копии, а затем проверив, отличается ли самая последняя удаленная фиксация. Я не могу понять, как получить эту информацию.
Я новичок в GIT, и это сводит меня с ума, поэтому заранее огромное спасибо за любую помощь!
Вы можете проверить, изменился ли наконечник (он же HEAD) локальной ветви до и после того, как вы потянули.
cd /usr/local/nagios
before=$(git rev-parse HEAD)
git pull
after=$(git rev-parse HEAD)
if [[ $before != $after ]]; then
service nagios reload
fi
Вы можете использовать post-merge
хук, который срабатывает только при слиянии на стороне клиента и при отсутствии конфликтов.
Содержание post-merge
:
#!/bin/bash
/etc/init.d/nagios reload
Скопируйте файл в .git/hooks
на стороне клиента и не забудьте chmod u+x post-merge
Если вы хотите узнать, есть ли новые изменения для выборки, вы можете сравнить вывод следующих команд:
$ git show-ref origin/master # <-- Where this repo thinks "origin/master" is
5bad423ae8d9055d989a66598d3c4473dbe97f8f refs/remotes/origin/master
$ git ls-remote origin master # <-- Where "origin" thinks "master" is
060bbe2125ec5e236a6c6eaed2e715b0328a9106 refs/heads/master
Если хеши различаются, есть изменения для выборки:
$ git remote update
Fetching origin
...
From github.com:xxxx/yyyy
5bad423..060bbe2 master -> origin/master
Используйте контрольные суммы, отображаемые git log
. Например:
cd /usr/local/nagios
git fetch
if [ "$(git log | head -n 1)" != "$(git log origin | head -n 1)" ]; then
git pull
/etc/init.d/nagios reload
fi
cd -