The problem is that git does not know what to delete (it does not have an index in the work tree, tracking such things). It should be possible to resolve this with an index for each work tree, but I think it’s easier just to git checkout -f into a new empty directory, and then rename the new directory and the old one so that the new version of “go live”, This also shortens the race status window : now there is only one short moment (between mv operations) when there is no version, and not a slightly longer window (during checkout ) when there is a combination of old and new versions.
Note. You show that the script will look too much if there is a tag named master or develop , since the link names for these two are refs/tags/master and refs/tags/develop respectively. I would recommend installing this (if you are interested :-)) through the shell function and case , in order to reduce the spawning process in cases not related to deployment, for example:
die() { echo " $@ " >&2 exit 1 } # deploy (to given path, $1) the version named by $2 # if the target is /some/path/there we use a temp version # named /some/path/tmp.<pid> to hold the new one until we # can swap it out, and $1.old.<pid> while we remove the old. deploy() { local path=$1 branch=$2 local tmpdir=${path%/*}/tmp.$$ # tune this as needed echo "deploying $branch to $path via $tmpdir..." trap "rm -rf $tmpdir" 0 1 2 3 15 mkdir $tmpdir || die "can't create work dir $tempdir" git --work-tree=$tmpdir/ checkout -f $branch mv $path $path.old.$$ || die "unable to move live version out of the way" mv $tmpdir $path || die "unable to set new version live" trap - 0 1 2 3 15 echo "done, cleaning up old version" rm -rf $path.old.$$ } while read oldrev newrev ref; do case $ref in refs/heads/master) deploy /path/to/my/project/live master;; refs/heads/develop) deploy /path/to/my/project/dev develop;; esac done
(note: fully unverified).
torek
source share