pip install pyGitDeploy



A script for rapid deployment to FTP servers. The script uses git to find changes since last deployment and applies the changes to an FTP server, if no previous deployment has been made it uploads all watched files.


Most shared hosting environments dont allow ssh, let alone git. To make sure all relevant changes are uploaded when your project reaches its next iteration this script runs a diff between your last deployment and current HEAD then syncs those changes with an FTP server.

New in version:


  • Change the way last deployment is saved, it is now saved in a file named lastDeploy on the server



Clone the repo from github, then

paver install


python install


Assuming python and this script is in your path:

git deploy

The script will prompt you for ftp details and start the deployment process.


git deploy [-v <level>| --verbose <level>] [-n | --dry-run] <target>
  • --dry-run


    Runs the script without making any remote changes, only saves configuration and tells you what it would have done

  • --verbose


    Runs in verbose mode, the optional parameter specifies how verbose it should be, 0-5

Target is a named target server, the config file will keep track of individual targets and deployments

Config files

The config file is named deploy.cfg and is a standard ini-format file


The [global] section holds options valid for all remotes.

The [ftp] section and its siblings [ftp:<target>] represents individual deploy targets.

A sample config file has been provided.



ignore = ["file1","file2","*.glob"]


The ignore option must be placed in the global section and is a json array with each item representing a Glob pattern.

Ignored files are not uploaded



target_specific_files = {"config.ini":"config_online.ini",".htaccess",".htaccess_online"}


The target_specific_files must be placed in a target section and takes the form of a json object. When looking at individual key : value pairs the key will be deleted online and value will take its place

Tested environments:

Windows versions:

  • Windows 7
  • Windows 8
  • Windows 8.1

OS X versions:

Note: osx may require manual installation of gitpython using pip or easy_install. pip install gitpython did the trick for me.

  • El Capitan

Linux versions:

  • Mint 11-12
  • Ubuntu 10-14

Python versions:

  • 2.7.1-2.7.10

If you have used this script anywhere else with success feel free to send me a message and I will update this document.

Todo for version 1:

  • Add --revert to quickly go back to last deployment
  • Verbosity levels (work in progress)
  • Document command line options


Adeodato Simó for raw_input with editable default



  • Bugfix, checking for filesize when uploading a replacement file would trigger an exception. We now use that exception instead of filesize


  • Config now has a target specific option called target_specific_files, see the section on config files for details target_specific_files are provided instead of the proposed target specific branches.


  • Ignored files can now be a standard Glob pattern


  • Deploying using a diff from a specific commit was not as useful as hoped, instead you can supply a named target
  • Config has been moved outside of the git folder and into the repo root
  • Config now has a global section
    • Global section has an ignore option, this takes the form of a list of files to ignore for upload


  • Major rewrite, now uses Paver
  • Documentation overhaul in the works using Pycco


  • Now handles submodules

  • Fix bug #4 "Crashes when not run from repo root"

0.5.1 -

  • Default/previous values should now be presented correctly.
  • Fixed an issue with binary files, all files are now treated as binary.
  • Fixed a bloody stupid mistake when retrieving the hex of the current HEAD
  • Now actually deletes the files
  • Updated the way the script handles no previous commits (grabs all files with git ls-files)
  • Verbosity now a parameter
  • Added -n or --dry-run for a simulated run (no upload, no directories created remotely)
  • More verbosity
  • Made it possible to specify a specific state to deploy (in preperation for git deploy --revert)
  • Better format for default values
  • Retains previously input values as default (except for password)


  • Now actually saves remote information