If you add the following script as a hooks/post-receive
hook to a bare git repository foo.git
:
#!/bin/sh
GIT_WORK_TREE=/bar git checkout -f
then whenever someone pushes to the repository the current state will be updated in directory bar
.
This requires bar
and foo.git
to be on the same machine.
What's the easiest way to modify it so that the checkout is made on a remote machine (say baz:/bar
) ?
One way would be to:
#!/bin/sh
GIT_WORK_TREE=/tmp/bar git checkout -f
rsync ... /tmp/bar baz:/bar
Is there a better way? Perhaps not requiring an intermediate temp directory? (If not what are the correct options to pass to rsync such that the resulting directory is indentical to being checked out directly?)
GIT_WORK_TREE=/bar
means thatbar
is a git repo.If
bar
is a git repo on the remote side, then it can pull from a bare repobare_bar.git
(also on the remote side), to which you can push to.In other words, your
post-receive
hook would push to bare_bar repo through ssh, and apost-receive
hook on that bare repo would trigger the pull from the actual repobar
: see "Creating a git repository from a production folder".In that case, your current post-receive hook and its
rsync
command seems to be the only way to incrementally copy new data to a remote working tree.git archive
would archive everything each time.git bundle
would require git on the other side.