diff options
author | Junio C Hamano <junkio@cox.net> | 2005-09-17 11:56:41 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-09-17 11:56:41 -0700 |
commit | 4447badcd22a889d656192803eff1003602839c5 (patch) | |
tree | 6194c273a13907fea9bb5df76e681bec1c9df462 /git-fetch.sh | |
parent | 8805ccac40348094d26b3b892c6ca3d08dc12ae0 (diff) | |
download | git-4447badcd22a889d656192803eff1003602839c5.tar.gz git-4447badcd22a889d656192803eff1003602839c5.tar.xz |
Teach rsync transport about alternates.
For local operations and downloading and uploading via git aware protocols,
use of $GIT_OBJECT_DIRECTORY/info/alternates is recommended on the server
side for big projects that are derived from another one (like Linux kernel).
However, dumb protocols and rsync transport needs to resolve this on the
client end, which we did not bother doing until this week.
I noticed we use "rsync -z" but most of our payload is already compressed,
which was not quite right. This commit also fixes it.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'git-fetch.sh')
-rwxr-xr-x | git-fetch.sh | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/git-fetch.sh b/git-fetch.sh index 227394403..72f17ab6c 100755 --- a/git-fetch.sh +++ b/git-fetch.sh @@ -183,12 +183,30 @@ do ;; rsync://*) TMP_HEAD="$GIT_DIR/TMP_HEAD" - rsync -L "$remote/$remote_name" "$TMP_HEAD" || exit 1 + rsync -L -q "$remote/$remote_name" "$TMP_HEAD" || exit 1 head=$(git-rev-parse TMP_HEAD) rm -f "$TMP_HEAD" test "$rsync_slurped_objects" || { - rsync -avz --ignore-existing "$remote/objects/" \ - "$GIT_OBJECT_DIRECTORY/" || exit + rsync -av --ignore-existing --exclude info \ + "$remote/objects/" "$GIT_OBJECT_DIRECTORY/" || exit + + # Look at objects/info/alternates for rsync -- http will + # support it natively and git native ones will do it on the remote + # end. Not having that file is not a crime. + rsync -q "$remote/objects/info/alternates" "$GIT_DIR/TMP_ALT" || + rm -f "$GIT_DIR/TMP_ALT" + if test -f "$GIT_DIR/TMP_ALT" + then + resolve_alternates "$remote" <"$GIT_DIR/TMP_ALT" | + while read alt + do + case "$alt" in 'bad alternate: '*) die "$alt";; esac + echo >&2 "Getting alternate: $alt" + rsync -av --ignore-existing --exclude info \ + "$alt" "$GIT_OBJECT_DIRECTORY/" || exit + done + rm -f "$GIT_DIR/TMP_ALT" + fi rsync_slurped_objects=t } ;; |