Privateer Pattern

The aim of the privateer pattern is to be able to develop julia code in a separate branch synchronised over several computers without giving information away to the official github repository. This is a means to be able to develop unpublished algorithms. It should however not become a stable solution as it decreases mergability: Merge every privateer branch back into the master branch as soon as possible.

First you will need a private repository on a server to synchronize over. If you don’t have a private github repo at your disposal, you can also create a “bare repository” on any ssh reachable machine. We will call this repository “privateer”.

mkdir privateer
cd privateer
git init --bare

Next, on every machine that participates in the pattern, make sure that a git push only pushes the master branch to origin (the github repo). For the following changes to the `.git/config` a good reference is Refspec. The essence being that reference specifications go like

[+]<src>:<dest>

The plus sign tells Git to update the reference even if it isn’t a fast-forward. <src> is the specification of the reference on the source machine, <dest> on the destination machine. E.g. by default when we pull from a remote repo, we always keep a reference in remotes/machinename for every branch on the remote machine (asserting reachability). This is achieved by

fetch = +refs/heads/*:refs/remotes/origin/*

because we want it to always overwrite the local position (+), on the remote machine the path is `git/refs/heads/anybranch`, and on the local machine the path is `.git/refs/remotes/origin/anybranch`. Obviously this line has to be in the specifications for [remote "origin"]. While this line – as it is the default – should already exist in your `.git/config` we now need to add the following line

push = refs/heads/master:refs/heads/master

Note that you can also always specify the refspec on the commandline (even abbreviated) so this only corrects the default behaviour.

Now we need to add the remote “privateer” on every machine.

git remote add privateer ssh://<user>@<domainname>:<port>//path/to/repo

On one machine we now need to branch for the new feature branch “feature”.

git checkout -b feature

Now the following lines that we add into the `.git/config` should make sense:

[remote "privateer"]
       url = ssh://<user>@<domainname>:<port>//path/to/repo
       fetch = +refs/heads/feature:refs/remotes/privateer/feature
       push = refs/heads/feature:refs/heads/feature
[branch "feature"]
       remote = privateer
       merge = refs/heads/feature

The branch configuration allows a simply git push on the commandline, where the remote is auto-detected from the current branch.

After the initial git push on the first machine and all the adjustments of the configurations on the other machines we can now pull those branches in on those machines with

git pull privateer feature:feature

Don’t forget to

git reset --hard origin/master

afterwards (while still checked out at master) to reset the master branch to its original position.