Skip to content

Commit

Permalink
Merge branch 'sb/submodule-fetch-nontip'
Browse files Browse the repository at this point in the history
When "git submodule update" did not result in fetching the commit
object in the submodule that is referenced by the superproject, the
command learned to retry another fetch, specifically asking for
that commit that may not be connected to the refs it usually
fetches.

* sb/submodule-fetch-nontip:
  submodule: try harder to fetch needed sha1 by direct fetching sha1
  • Loading branch information
gitster committed Feb 26, 2016
2 parents 03f682b + fb43e31 commit 9671a76
Showing 1 changed file with 26 additions and 3 deletions.
29 changes: 26 additions & 3 deletions git-submodule.sh
Original file line number Diff line number Diff line change
Expand Up @@ -591,6 +591,24 @@ cmd_deinit()
done
}

is_tip_reachable () (
clear_local_git_env
cd "$1" &&
rev=$(git rev-list -n 1 "$2" --not --all 2>/dev/null) &&
test -z "$rev"
)

fetch_in_submodule () (
clear_local_git_env
cd "$1" &&
case "$2" in
'')
git fetch ;;
*)
git fetch $(get_default_remote) "$2" ;;
esac
)

#
# Update each submodule path to correct revision, using clone and checkout as needed
#
Expand Down Expand Up @@ -745,10 +763,15 @@ Maybe you want to use 'update --init'?")"
then
# Run fetch only if $sha1 isn't present or it
# is not reachable from a ref.
(clear_local_git_env; cd "$sm_path" &&
( (rev=$(git rev-list -n 1 $sha1 --not --all 2>/dev/null) &&
test -z "$rev") || git-fetch)) ||
is_tip_reachable "$sm_path" "$sha1" ||
fetch_in_submodule "$sm_path" ||
die "$(eval_gettext "Unable to fetch in submodule path '\$displaypath'")"

# Now we tried the usual fetch, but $sha1 may
# not be reachable from any of the refs
is_tip_reachable "$sm_path" "$sha1" ||
fetch_in_submodule "$sm_path" "$sha1" ||
die "$(eval_gettext "Fetched in submodule path '\$displaypath', but it did not contain $sha1. Direct fetching of that commit failed.")"
fi

# Is this something we just cloned?
Expand Down

0 comments on commit 9671a76

Please sign in to comment.