Checkout Git files to a location outside the repository

Yes, this is certainly possible.

Lets say I have a bare repository named /srv/production.git on the destination system/server.

On the destination system I can use the command cd /srv/production.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

If I am in a non-bare repository the command is slightly different. Lets say I have a non-bare respository at /srv/testing. To checkout that I would use cd /srv/testing/.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

In fact on my system I even automate this in a post-commit hook in my production.git repository. So when you push to production.git the latest version is automatically check out to the web root.

#!/bin/sh
#
# An example hook script that is called after a successful
# commit is made.
#
# To enable this hook, rename this file to "post-commit".

GIT_WORK_TREE=/srv/production-www/ git checkout -f
# ... misc other commands to verify permissions are set correctly.

If your only access to the remote system is webdav, it certainly should be possible to write a post-commit hook that will checkout to the webdav host, either directly or to a temporary location, which you can then script an upload.


If you just want the files, you can use git archive. Usually it writes to an archive like tarballs or ZIP, but you can pipe it as well:

git archive master | tar -x -C /some/path

Here, master obviously is the branch you want to archive, and /some/path will contain just the files – no .git or .gitignore.


Or you can use git checkout-index which more closely resembles a "checkout" of files:

git checkout-index -f -a --prefix=/some/path/

Here, the -a option tells git to check out all files. The prefix will be prepended to the output. Somebody also wrote a wrapper around this to give a git export.