Using shell script to detect GIT changes.
What I’m trying to accomplish here is having a shell script run and then see if there are any changes to a specific git branch. If there are some changes then do some work. The reason I want a shell script is, so I can put it on a cron job since you can’t do real-time triggers like you can on a git server. My current git server is hosted elsewhere.
Why not use a CI (continuous integration) to do this? I’m cheap 😃. I currently use Bitbucket, and they only give you fifty minutes’ free time and this will probably take longer than that, and I don’t want to be pigeonholed into a specific CI.
Fetch from GIT
So the first thing thing you need to do is a git fetch.
git --git-dir=/path/to/source/.git --work-tree=/path/to/source fetch --quiet
adding in --git-dir
and --work-tree
will allow you to run this script where ever you want. Doesn’t have to be in the working tree. This will be needed on all git calls.
Detecting changes
So now how do we detect a change from the local branch to a remote branch? We can use git diff
.
git --git-dir=/path/to/source/.git --work-tree=/path/to/source diff --quiet origin
So --quet
will only output if there are changes otherwise it will return false. origin
is the remote server. If you are looking for a specific branch you would do origin/<branch>
(ex. origin/staging
).
Putting the script together
So now if we put this two lines in a script you get something like.
#!/bin/sh
git --git-dir=/path/to/source/.git --work-tree=/path/to/source fetch --quiet
if ! git --git-dir=$/path/to/source/.git --work-tree=/path/to/source diff --quiet origin
then
## for changes to stick, you need to pull them otherwise it will always have changes
git --git-dir=/path/to/source/.git --work-tree=/path/to/source pull --quiet
## do stuff
fi
Final
Now you can add this to a cronjob and have it execute at any time interval you want. I only have mine trigger during work hours, so I don’t overload the git servers.