Simple git-based deployment for fabric
Latest commit 5e27f82 Aug 21, 2016 @dbravender Ignore build files


Very simple git-based deployment for fabric.

Git pulling from a remote repository requires that you open your repository to the world and it means your deployment process relies on one more moving piece. Since git is distributed you can push from your local repository and rely on one fewer external resource and limit access to your private repositories to your internal network but still get lightning fast git deployments.


pip install gitric


  • Uses git push instead of git pull.
    • Pre-seeds your target's immutable git object store so you can stop and restart your server before and after the working copy is modified instead of waiting for network IO and the working copy to update.
  • Won't let you deploy from a dirty working copy (can be overridden for testing).
  • Won't let you lose history (can be overridden for rollbacks).
cd example
virtualenv .env --no-site-packages
source .env/bin/activate
pip install -r requirements.txt
fab -l
Available commands:
    allow_dirty  allow pushing even when the working copy is dirty
    deploy       an example deploy action
    force_push   allow pushing even when history will be lost
    prod         an example production deployment

After creating a test-deploy user on my server:

fab prod deploy
[yourserverhere] out: HEAD is now at b2db04e Initial commit

Disconnecting from yourserverhere... done.

You can't deploy when your working copy is dirty:

touch dirty_working_copy
fab prod deploy
Fatal error: Working copy is dirty. This check can be overridden by
importing gitric.api.allow_dirty and adding allow_dirty to your call.


And it (well git) won't let you deploy when you would lose history unless overridden with a force_push:

# simulate a divergent history
echo "#hello" >> requirements.txt
git add requirements.txt
git commit --amend
fab prod deploy
Fatal error: 11485c970d21ea2003c0be3be820905220d34631 is a non-fast-forward
push. The seed will abort so you don't lose information. If you are doing this
intentionally import gitric.api.force_push and add it to your call.