Re: git pull issues...
- From
Dan Holmsand <holmsand@gmail.com>
- Date
- Apr 25, 2005, 21:31 UTC
- Message-ID
- <d4jn91$n4f$1@sea.gmane.org>
- In-Reply-To
- <118833cc05042514076221624d@mail.gmail.com>
Morten Welinder wrote:
Show 13 quoted lines
> On 4/23/05, Petr Baudis <pasky@ucw.cz> wrote: > >>>1. Multiple rsync call might connect to different servers (with >>>round-robin DNS). The effect >>> will be interesting. One call, if possible, would be better. >> >>If you can do it without overwriting HEAD, please go ahead and send me >>the patch. :-) > > > This ought to work. It basically saves to a different directory while > still ignoring > all the files we have.
I was just looking at the same thing. Not saying this is better, or anything, bit it has, perhaps, the slight advantage that downloaded objects aren't thrown away, so that a pull can be safely resumed. Also, it doesn't download anything from an url that doesn't contain ./HEAD, ./heads or ./objects. That might be a good thing if you accidentally try to pull from, say, kernel.org/pub/...
/dan
Here goes:
Index: gitpull.sh =================================================================== --- 7de71a831508e51e0985cea173f3f7a7012c82b7/gitpull.sh (mode:100755 sha1:6abc7f5c00fd3e082d0a34a238a53b67c38b8a7f) +++ uncommitted/gitpull.sh (mode:100755) @@ -18,7 +18,7 @@ [ "$name" ] || name=$(cat .git/tracking 2>/dev/null) [ "$name" ] || die "where to pull from?" uri=$(grep $(echo -e "^$name\t" | sed 's/\./\\./g') .git/remotes | cut -f 2) -[ "$uri" ] || die "unknown remote" +[ "$uri" ] || die "unknown remote '$name'" rembranch=master if echo "$uri" | grep -q '#'; then @@ -38,28 +38,39 @@ fi -mkdir -p .git/heads -rsyncerr= -rsync $RSYNC_FLAGS -Lr "$uri/heads/$rembranch" ".git/heads/$name" 2>/dev/null || rsyncerr=1 -if [ "$rsyncerr" ] && [ "$rembranch" = "master" ]; then - rsyncerr= - rsync $RSYNC_FLAGS -Lr "$uri/HEAD" ".git/heads/$name" | grep -v '^MOTD:' || rsyncerr=1 +mkdir -p .git/heads .git/objects .git/tags || die +pulldir=$(mktemp -td gitpull.XXXXXX) +[ -d "$pulldir" ] || die "failed to create temp dir" +ln -s $(pwd)/.git/objects $(pwd)/.git/tags $pulldir || die +mkdir $pulldir/heads || die + +echo pulling $uri + +rout=$pulldir/rsync_errors +rsync $RSYNC_FLAGS -LKrv --whole-file --ignore-existing \ + --include '/HEAD' --include '/heads/' --include '/tags/' \ + --include '/objects/' --exclude='/*' \ + "$uri/." $pulldir 2>$rout || { + cat $rout; die "failed to pull from $uri" + } + +if [ -f "$pulldir/heads/$rembranch" ]; then + cp "$pulldir/heads/$rembranch" ".git/heads/$name" || die +elif [ master = "$rembranch" -a -f $pulldir/HEAD ]; then + cp $pulldir/HEAD ".git/heads/$name" || die +else + echo "unable to get the head pointer of branch $rembranch" >&2 + echo "is $uri a valid git repository?" >&2 + die "pull failed" fi -[ "$rsyncerr" ] && die "unable to get the head pointer of branch $rembranch" -[ -d .git/objects ] || mkdir -p .git/objects -# We already saw the MOTD, thank you very much. -rsync $RSYNC_FLAGS --ignore-existing --whole-file \ - -v -Lr "$uri/objects/." ".git/objects/." | grep -v '^MOTD:' || die "rsync error" +# TODO: Check that at least the head commit exists. -# FIXME: Warn about conflicting tag names? -# XXX: We now throw stderr to /dev/null since not all repositories -# may have tags/ and users were confused by the harmless errors. -[ -d .git/tags ] || mkdir -p .git/tags -rsync $RSYNC_FLAGS --ignore-existing \ - -v -Lr "$uri/tags/." ".git/tags/." 2>/dev/null | grep -v '^MOTD:' || die "rsync error" +rm -rf $pulldir +# FIXME: Warn about conflicting tag names? + new_head=$(cat ".git/heads/$name") if [ ! "$orig_head" ]; then