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

Re: [PATCH v2] Fix fetch/pull when run without --update-head-ok

From
Junio C Hamano <gitster@pobox.com>
Date
Oct 14, 2008, 22:07 UTC
Message-ID
<7vk5ca7rw3.fsf@gitster.siamese.dyndns.org>
In-Reply-To
<alpine.LNX.1.00.0810141258050.19665@iabervon.org>
Daniel Barkalow <barkalow@iabervon.org> writes:
Show 10 quoted lines
> On Tue, 14 Oct 2008, Daniel Barkalow wrote:
> ...
>> That is, it uses --update-head-ok because "git pull origin master:master" 
>> will work correctly, regardless of whether the local master is 
>> yet-to-be-born or not.
>
> In particular, the --update-head-ok is from b10ac50f, which is what added 
> the check to prohibit fetching into the current branch otherwise, back in 
> August 2005. There's never been anything preventing updating the current 
> branch using "pull".

What you wrote above is correct, and it is all that is necessary to make "pull master:master" (when 'master' is the current branch) work correctly, in normal situations. Dscho's patch is in itself is a good thing to do, but is not necessary when the caller gives --update-head-ok.

Nor is it sufficient. Have you tested the current "git-pull" with or without Dscho's patch applied to "git-fetch" when 'master' is an unborn branch? "git-pull" has this piece:

        curr_head=$(git rev-parse --verify HEAD 2>/dev/null)
        if test "$curr_head" != "$orig_head"
        then
                # The fetch involved updating the current branch.
                # The working tree and the index file is still based on the
                # $orig_head commit, but we are merging into $curr_head.
                # First update the working tree to match $curr_head.
                echo >&2 "Warning: fetch updated the current branch head."
                ...
        fi

The above part (written by yours truly) did not care what happens when the current branch is unborn. Back then when git-pull was originally written, nobody was crazy enough to pull into an empty branch and expect it to work. The code to allow that craziness (look for "initial pull" in the same script to find a 6-line block near the end) came much later, and the commit that added the "initial pull" support should have adjusted the above codeblock if it really wanted to support pulling into an unborn branch, but it forgot to do so. It also forgot to handle the case where the originally unborn current branch was fetched into.

If we really care about is "git pull origin master:master" into an unborn branch, I think we need the attached patch on top, and this is regardless of Dscho's patch that tightens the check when -update-head-ok is not given.

 git-pull.sh |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
diff --git c/git-pull.sh w/git-pull.sh
index 75c3610..664fe34 100755
--- c/git-pull.sh
+++ w/git-pull.sh
@@ -124,7 +124,7 @@ orig_head=$(git rev-parse --verify HEAD 2>/dev/null)
 git fetch --update-head-ok "$@" || exit 1
 
 curr_head=$(git rev-parse --verify HEAD 2>/dev/null)
-if test "$curr_head" != "$orig_head"
+if test -n "$orig_head" && test "$curr_head" != "$orig_head"
 then
 	# The fetch involved updating the current branch.
 
@@ -172,7 +172,7 @@ esac
 
 if test -z "$orig_head"
 then
-	git update-ref -m "initial pull" HEAD $merge_head "" &&
+	git update-ref -m "initial pull" HEAD $merge_head "$curr_head" &&
 	git read-tree --reset -u HEAD || exit 1
 	exit
 fi
Previous: Daniel BarkalowNext: Junio C Hamano
Message 22 of 24 in “fetch: refuse to fetch into the current branch in a non-bare repository”
  1. fetch: refuse to fetch into the current branch in a non-bare repositoryJohannes Schindelin, Oct 11, 2008
  2. Junio C HamanoOct 11, 2008
  3. Shawn O. PearceOct 12, 2008
  4. Johannes SchindelinOct 13, 2008
  5. Shawn O. PearceOct 12, 2008
  6. Daniel BarkalowOct 12, 2008
  7. Fix fetch/pull when run without --update-head-okJohannes Schindelin, Oct 13, 2008
  8. Shawn O. PearceOct 13, 2008
  9. Johannes SchindelinOct 13, 2008
  10. Junio C HamanoOct 13, 2008
  11. Junio C HamanoOct 13, 2008
  12. Johannes SchindelinOct 13, 2008
  13. Daniel BarkalowOct 13, 2008
  14. Johannes SchindelinOct 14, 2008
  15. Shawn O. PearceOct 14, 2008
  16. Daniel BarkalowOct 14, 2008
  17. Johannes SchindelinOct 14, 2008
  18. Daniel BarkalowOct 14, 2008
  19. Johannes SchindelinOct 14, 2008
  20. Daniel BarkalowOct 14, 2008
  21. Daniel BarkalowOct 14, 2008
  22. Junio C HamanoOct 14, 2008
  23. pull: allow "git pull origin $something:$current_branch" into an unborn branchJunio C Hamano, Oct 14, 2008
  24. Daniel BarkalowOct 13, 2008

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.