Hi list,
I mentioned in another mail that I needed the opposite of git-push, namely
getting all heads, and if they are strict parents of the local refs, just
update them.
Well, Junio pointed out that it's easy using the available tools, and he
was right. The result is attached (and tested...).
This script makes it easy to work with a central repository, multiple
heads and users, in a CVS style: to start your day, you call the attached
script, and after you have committed something, you can do a push on the
repository. Sometimes, the push fails, then you have to pull that branch
in order to merge it before trying a push again.
BTW, if you are lazy, like me, you just pull from Junio once in a while
and do a make test. Turns out there is a missing dependency though:
peek-remote.o: cache.h
which in my case lead to a git-peek-remote program which was unable to
peek any ref.
Ciao,
Dscho
#!/bin/sh
. git-sh-setup-script || die Not a git archive
. git-parse-remote $@
repo=$_remote_repo
git-ls-remote-script --heads $repo | while read sha1 refname; do
shortname=$(basename $refname)
if [ -e $GIT_DIR/$refname ]; then
if [ $sha1 = $(cat $GIT_DIR/$refname) ]; then
echo $shortname up to date. 12
continue
fi
fi
git-cat-file commit $sha1 /dev/null 21 ||
git-fetch-script $repo $shortname
if [ ! -e $GIT_DIR/$refname ]; then
echo Got new head $shortname 12
echo $sha1 $GIT_DIR/$refname
else
origsha1=$(cat $GIT_DIR/$refname)
if [ -z $(git-rev-list $origsha1 ^$sha1) ]; then
echo Updated head $shortname 12
echo $sha1 $GIT_DIR/$refname
else
saveref=$GIT_DIR/FETCH_HEAD_$shortname
echo Error: $shortname not a child of remote head 12
echo Saved remote head to $saveref 12
echo $sha1 $saveref
fi
fi
done