Re: git pull issues...
- From
- Morten Welinder <mwelinder@gmail.com>
- Date
- Apr 25, 2005, 21:07 UTC
- Message-ID
- <118833cc05042514076221624d@mail.gmail.com>
- In-Reply-To
- <20050423220049.GC13222@pasky.ji.cz>
On 4/23/05, Petr Baudis <pasky@ucw.cz> wrote:
Show 6 quoted lines
> > 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.
Morten
Index: gitpull.sh =================================================================== --- 7de71a831508e51e0985cea173f3f7a7012c82b7/gitpull.sh (mode:100755 sha1:6abc7f5c00fd3e082d0a34a238a53b67c38b8a7f) +++ uncommitted/gitpull.sh (mode:100775) @@ -37,28 +37,32 @@ [ -s ".git/heads/$name" ] && orig_head=$(cat ".git/heads/$name") 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 +dotgit=dot-git +test -d "$dotgit" && die "$dotgit already exists -- please clean up." +mkdir -p "$dotgit" "$dotgit/objects" "$dotgit/tags" \ + || die "failed to create $dotgit." + +(cd .git && find objects -type f -print0 && find tags -type f -print0) | \ + rsync $RSYNC_FLAGS --from0 --exclude-from=- --whole-file -Lrv "$uri/" "$dotgit" || \ + { rm -rf "$dotgit"; die "rsync from $uri/ failed."; } + +# Move new files into place +find "$dotgit/objects" -type f -print0 | \ + perl -n0e 'chomp; $src=$_; s{^[^/]+/}{.git/}; rename $src, $_ or die "failed to move $src into place: $!\n";' +find "$dotgit/tags" -type f -print0 | \ + perl -n0e 'chomp; $src=$_; s{^[^/]+/}{.git/}; rename $src, $_ or die "failed to move $src into place: $!\n";' + +mkdir -p .git/heads || die "failed to create .git/heads" +if [ -r "$dotgit/heads/$rembranch" ]; then + mv "$dotgit/heads/$rembranch" ".git/heads/$name" +elif [ "$rembranch" = "master" -a -r "$dotgit/HEAD" ]; then + mv "$dotgit/HEAD" ".git/heads/$name" +else + rm -rf "$dotgit" + die "unable to get the head pointer of branch $rembranch" 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" - -# 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 "$dotgit" new_head=$(cat ".git/heads/$name")