Is it possible to “checkout” to a location outside of the repository? What I mean is a clone of a branch without the “.git” directory.
For example: Use git to manage a website. You edit some files, commit and copy the files to a web server via WebDAV. The WebDAV-path would be the location outside the repository, which shouldn't contain the “.git”.
This may not be the problem for which git was build, but is this possible?
13 Answers
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.
1If 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.
Since Git 1.8.5, you can use -C <path> option, to run as if git was started in <path>, instead of the current working directory.
On older Git versions, use --work-tree option. For example::
repo_url= repo_dir=$(basename $repo_url .git) git clone $repo_url git --work-tree=$repo_dir checkout $branch