将简单的BASH更新脚本从SVN迁移到GIT

我们通过SVN保持Nagiosconfiguration的最新状态,用户每15分钟提交一次更改和脚本。 脚本检查更新,然后检查那些更新parsingconfiguration检查,然后重新加载configuration。 漂亮而简单,完美地完成了这项工作。

我们最近搬到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 - 

我遇到的问题是我似乎无法得到输出parsing,所以我可以匹配它。 我想通过检查本地工作副本中最近的提交来检查不同的路由,然后检查远程最近的提交是否不同。 我无法弄清楚如何获取这些信息。

我对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 

如果您想知道是否有新的更改,您可以比较以下命令的输出:

 $ 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 

您可以使用post-merge挂钩,只有在客户端存在合并并且没有冲突时才会触发。

post-merge内容:

 #!/bin/bash /etc/init.d/nagios reload 

将文件复制到客户端的.git/hooks ,不要忘记chmod u+x post-merge

使用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 -