git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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
Previous: Morten WelinderNext: Morten Welinder
Message 5 of 6 in “git pull issues...”
  1. Morten WelinderApr 23, 2005
  2. Petr BaudisApr 23, 2005
  3. Morten WelinderApr 24, 2005
  4. Morten WelinderApr 25, 2005
  5. Dan HolmsandApr 25, 2005
  6. Morten WelinderApr 25, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.