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
--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.
So now how do we detect a change from the local branch to a remote branch? We can use
git --git-dir=/path/to/source/.git --work-tree=/path/to/source diff --quiet origin
--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
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
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.