Назад | Перейти на главную страницу

Перенос простого скрипта обновления BASH из SVN в GIT

Раньше мы обновляли конфигурацию 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 -