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

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

我们过去常常通过 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 -

相关内容