Synchronising Gitbare and Bitbucket

If a project is using both Gitbare and Bitbucket at the same time then we can sync the commits and changes between each repository. We do this by using a post receive hook on Gitbare to fetch commits down and push changes up.

Initial Setup and Sync

There is a script in the home directory that does all of the heavy lifting and this needs calling from the post receive hook. To create the hook, create a new file in the hooks directory of the bare repository you want to sync called post-receive.

Use chmod to add executable permission chmod u+x post-receieve. This will allow git to execute it. Inside the file, paste the following snippet.

1
2
3
4
5
#!/usr/bin/env bash

bitbucketSlug="git@bitbucket.org:user/my-client-repo.git";

bash /home/ec/bitbucket-sync.bash "$bitbucketSlug"

Replace the contents of bitbucketSlug with the remote value you would use with git remote in your normal non-bare repository. Now when you push, you should see the commits being received by Bitbucket.

If you do not want your pushes to be delayed, you can background the bitbucket sync like this:

1
2
3
4
5
6
7
#!/usr/bin/env bash

echo "Kicking off backgrounded bitbucket mirror"

bitbucketSlug="git@bitbucket.org:user/my-client-repo.git";

nohup bash /home/ec/bitbucket-sync.bash "$bitbucketSlug"  &> /dev/null &

Initial Sync

Warning

When doing the initial synchronisation, ensure that any Slack notifications are disabled as there will be a lot of noise generated from the initial sync

Warning

If you haven't used our gitBare previously, or stopped using it at some point, make sure to make it up to date by executing these commands in your project root: git push REMOTE '*:*' git push REMOTE --all. Where REMOTE is your remote repository name.

In the gitBare repository root, run the following to do the initial synchronisation.

1
2
git fetch <bitbucketSlug> '*:*';
bash hooks/post-receieve

Replace the bitbucket slug with the actual remote for your repository, this will pull in all the branches on Bitbucket but not on gitbare and synchronise every thing up.