X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=git-fetch.sh;h=6d3a3468b3f22d8eeb1a2ba568a6c8ed48606dbd;hb=27c96c4fd38ffbde98df22699c755a043bb383d1;hp=b04bd553f86213478a36f8ec2f19476f02ccf09f;hpb=17bee1947ac407c0a27f3ef7da573eacb848520e;p=git.git diff --git a/git-fetch.sh b/git-fetch.sh index b04bd553f..6d3a3468b 100755 --- a/git-fetch.sh +++ b/git-fetch.sh @@ -61,7 +61,7 @@ do quiet=--quiet ;; -v|--verbose) - verbose=Yes + verbose="$verbose"Yes ;; -k|--k|--ke|--kee|--keep) keep='-k -k' @@ -177,9 +177,40 @@ fetch_all_at_once () { git-bundle unbundle "$remote" $rref || echo failed "$remote" else - git-fetch-pack --thin $exec $keep $shallow_depth \ - $quiet $no_progress "$remote" $rref || - echo failed "$remote" + if test -d "$remote" && + + # The remote might be our alternate. With + # this optimization we will bypass fetch-pack + # altogether, which means we cannot be doing + # the shallow stuff at all. + test ! -f "$GIT_DIR/shallow" && + test -z "$shallow_depth" && + + # See if all of what we are going to fetch are + # connected to our repository's tips, in which + # case we do not have to do any fetch. + theirs=$(echo "$ls_remote_result" | \ + git-fetch--tool -s pick-rref "$rref" "-") && + + # This will barf when $theirs reach an object that + # we do not have in our repository. Otherwise, + # we already have everything the fetch would bring in. + git-rev-list --objects $theirs --not --all \ + >/dev/null 2>/dev/null + then + echo "$ls_remote_result" | \ + git-fetch--tool pick-rref "$rref" "-" + else + flags= + case $verbose in + YesYes*) + flags="-v" + ;; + esac + git-fetch-pack --thin $exec $keep $shallow_depth \ + $quiet $no_progress $flags "$remote" $rref || + echo failed "$remote" + fi fi ) | ( @@ -239,16 +270,8 @@ fetch_per_ref () { fi # Find $remote_name from ls-remote output. - head=$( - IFS=' ' - echo "$ls_remote_result" | - while read sha1 name - do - test "z$name" = "z$remote_name" || continue - echo "$sha1" - break - done - ) + head=$(echo "$ls_remote_result" | \ + git-fetch--tool -s pick-rref "$remote_name" "-") expr "z$head" : "z$_x40\$" >/dev/null || die "No such ref $remote_name at $remote" echo >&2 "Fetching $remote_name from $remote using $proto"