From: Dan Holmsand <holmsand@gmail.com>
To: git@vger.kernel.org
Subject: Re: git pull issues...
Date: Mon, 25 Apr 2005 23:31:02 +0200 [thread overview]
Message-ID: <d4jn91$n4f$1@sea.gmane.org> (raw)
In-Reply-To: <118833cc05042514076221624d@mail.gmail.com>
Morten Welinder wrote:
> 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
next prev parent reply other threads:[~2005-04-25 21:35 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-04-23 21:25 git pull issues Morten Welinder
2005-04-23 22:00 ` Petr Baudis
2005-04-24 0:39 ` Morten Welinder
2005-04-25 21:07 ` Morten Welinder
2005-04-25 21:31 ` Dan Holmsand [this message]
2005-04-25 23:43 ` Morten Welinder
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='d4jn91$n4f$1@sea.gmane.org' \
--to=holmsand@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.