我们过去常常通过 SVN 来更新 Nagios 配置,用户提交更改,脚本每 15 分钟运行一次。脚本检查更新,然后检查这些更新解析配置检查,然后重新加载配置。简单又好用,完美地完成了工作。
我们最近将 GIT 迁移到 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 还很陌生,这让我很抓狂,所以我在此先非常感谢大家的帮助!
答案1
您可以检查在拉取之前和之后本地分支的尖端(又名 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
答案2
如果您想知道是否有新的更改需要获取,可以比较以下命令的输出:
$ 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
答案3
您可以使用post-merge
钩子,它仅在客户端合并且没有冲突时才会触发。
内容post-merge
:
#!/bin/bash
/etc/init.d/nagios reload
在客户端复制文件.git/hooks
,不要忘记chmod u+x post-merge
答案4
使用 显示的校验和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 -