Users who merge frequently from remote repositories tend to prefer `git-pull .` over `git-merge` for local merges, as the pull interface is then consistent with how the user performs merges from remote repositories. Unfortunately `git-pull .` has a (small) amount of overhead on top of `git-merge` as it needs to first invoke git-fetch to prepare the FETCH_HEAD file. However we can easily detect this special case of a local merge and jump directly into git-merge, bypassing that overhead. This change also allows users of `git-pull .` to take advantage of the change made in commit e0ec1819, where git-merge uses the local branch name in conflict hunks if it is invoked as a porcelain, rather than as a plumbing. Users may also now use `git-pull . foo~3` to merge the early part of branch foo. This was not previously possible as git-fetch does not know how to fetch foo~3 from a repository. Unfortunately we cannot use this git-fetch bypass if the user is also updating some sort of tracking branch in the local repository as part of the pull from the local repository. This however is a rather crazy usage of `git-pull .`, but we used to support it, so we issue a silly warning message and use the older-style git-fetch path to continue supporting it. Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx> --- git-pull.sh | 27 +++++++++++++++++++++++++++ 1 files changed, 27 insertions(+), 0 deletions(-) diff --git a/git-pull.sh b/git-pull.sh index 28d0819..8c94fef 100755 --- a/git-pull.sh +++ b/git-pull.sh @@ -45,6 +45,33 @@ do shift done +if test "X$1" = X. +then + # We are merging from this repository. We can avoid fetch + # and go right into merge if the user isn't doing something + # odd like asking us to also update tracking branches in + # this repository as part of the pull. Yeah, they probably + # shouldn't do that - but we allowed it in the past... + # + direct_merge=1 + for remote + do + case "$remote" in + *:*) direct_merge=0; break;; + esac + done + if test $direct_merge = 1 + then + shift + exec git-merge \ + $no_summary $no_commit $squash $strategy_args \ + "$@" + else + echo >&2 "Clever... Updating tracking branch while pulling from yourself." + echo >&2 + fi +fi + orig_head=$(git-rev-parse --verify HEAD 2>/dev/null) git-fetch --update-head-ok "$@" || exit 1 -- 1.4.4.3.gd2e4 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html