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

Re: [PATCH] Documentation: update git-pull.txt for clone's new default behavior

From
Junio C Hamano <junkio@cox.net>
Date
Jan 1, 2007, 01:44 UTC
Message-ID
<7vwt47bjwa.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<7vd55zd1nm.fsf@assigned-by-dhcp.cox.net>
Junio C Hamano <junkio@cox.net> writes:
Show 14 quoted lines
> What we wanted to do ideally was to forbid "git pull" that does
> not have explicit refspec from the command line, without
> configuring branch.*.merge.  However this broke established
> workflow of people who has remote.$origin.fetch configured to
> list the remote branch to fetch explicitly; the merged branch
> selection has always been "the first set of branches listed in
> the configuration" and these peoples had their configuration
> right without needing to have branch.*.merge at all.
>
> Unfortunately git is too flexible around this area.  
>
> We probably could somehow arrante the remote branches that came
> from wildcarding not subject to the merge branch selection
> logic, but honestly I am tired of looking at that code for now.

I am still tired of looking at the code, but I would rather look at it now than having to still look at it next year.

How about doing this? The difference this time around is that if you have non-wildcard refspec listed first, which usually is the case for people with established git workflow with existing repositories, we use the old-and-proven rule to merge the first set of refs. An earlier round botched this completely by basing the logic on lack of branch.*.merge, which broke for many people.

-- >8 -- [PATCH] Do not merge random set of refs out of wildcarded refs

When your fetch configuration has only the wildcards, we would pick the lexicographically first ref from the remote side for merging, which was complete nonsense. Make sure nothing except the one that is specified with branch.*.merge is merged in this case.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
diff --git a/git-parse-remote.sh b/git-parse-remote.sh
index 144f170..d2e4c2b 100755
--- a/git-parse-remote.sh
+++ b/git-parse-remote.sh
@@ -76,16 +76,32 @@ get_remote_default_refs_for_push () {
 # from get_remote_refs_for_fetch when it deals with refspecs
 # supplied on the command line.  $ls_remote_result has the list
 # of refs available at remote.
+#
+# The first token returned is either "explicit" or "glob"; this
+# is to help prevent randomly "globbed" ref from being chosen as
+# a merge candidate
 expand_refs_wildcard () {
+	first_one=yes
 	for ref
 	do
 		lref=${ref#'+'}
 		# a non glob pattern is given back as-is.
 		expr "z$lref" : 'zrefs/.*/\*:refs/.*/\*$' >/dev/null || {
+			if test -n "$first_one"
+			then
+				echo "explicit"
+				first_one=
+			fi
 			echo "$ref"
 			continue
 		}
 
+		# glob
+		if test -n "$first_one"
+		then
+			echo "glob"
+			first_one=
+		fi
 		from=`expr "z$lref" : 'z\(refs/.*/\)\*:refs/.*/\*$'`
 		to=`expr "z$lref" : 'zrefs/.*/\*:\(refs/.*/\)\*$'`
 		local_force=
@@ -116,7 +132,8 @@ canon_refs_list_for_fetch () {
 	if test "$1" = "-d"
 	then
 		shift ; remote="$1" ; shift
-		set x $(expand_refs_wildcard "$@")
+		set $(expand_refs_wildcard "$@")
+		is_explicit="$1"
 		shift
 		if test "$remote" = "$(get_default_remote)"
 		then
@@ -125,6 +142,10 @@ canon_refs_list_for_fetch () {
 			merge_branches=$(git-repo-config \
 			    --get-all "branch.${curr_branch}.merge")
 		fi
+		if test -z "$merge_branches" && test $is_explicit != explicit
+		then
+			merge_branches=..this.will.never.match.any.ref..
+		fi
 	fi
 	for ref
 	do
Previous: J. Bruce FieldsNext: Luben Tuikov
Message 9 of 47 in “Docs: update cvs-migration.txt to reflect clone's new default behavior”
  1. Docs: update cvs-migration.txt to reflect clone's new default behaviorbfields@fieldses.org, Dec 31, 2006
  2. Documentation: update git-clone.txt for clone's new default behaviorbfields@fieldses.org, Dec 31, 2006
  3. Documentation: update git-pull.txt for clone's new default behaviorbfields@fieldses.org, Dec 31, 2006
  4. Documentation: update glossary entry for "origin"bfields@fieldses.org, Dec 31, 2006
  5. Documentation: remove master:origin example from pull-fetch-param.txtbfields@fieldses.org, Dec 31, 2006
  6. Documentation: update tutorial's discussion of originbfields@fieldses.org, Dec 31, 2006
  7. Junio C HamanoJan 1, 2007
  8. J. Bruce FieldsJan 1, 2007
  9. Junio C HamanoJan 1, 2007
  10. Luben TuikovJan 1, 2007
  11. J. Bruce FieldsJan 1, 2007
  12. Luben TuikovJan 1, 2007
  13. J. Bruce FieldsJan 1, 2007
  14. Luben TuikovJan 1, 2007
  15. Junio C HamanoJan 1, 2007
  16. Luben TuikovJan 1, 2007
  17. Theodore TsoJan 1, 2007
  18. Luben TuikovJan 1, 2007
  19. Theodore TsoJan 2, 2007
  20. Luben TuikovJan 2, 2007
  21. Junio C HamanoJan 2, 2007
  22. Luben TuikovJan 2, 2007
  23. J. Bruce FieldsJan 1, 2007
  24. J. Bruce FieldsJan 1, 2007
  25. Luben TuikovJan 2, 2007
  26. J. Bruce FieldsJan 2, 2007
  27. Theodore TsoJan 2, 2007
  28. Luben TuikovJan 2, 2007
  29. Junio C HamanoJan 2, 2007
  30. Luben TuikovJan 2, 2007
  31. Junio C HamanoJan 2, 2007
  32. Jakub NarebskiJan 2, 2007
  33. Luben TuikovJan 2, 2007
  34. Junio C HamanoJan 2, 2007
  35. Jakub NarebskiJan 2, 2007
  36. Luben TuikovJan 2, 2007
  37. Jakub NarebskiJan 2, 2007
  38. Junio C HamanoJan 2, 2007
  39. Luben TuikovJan 5, 2007
  40. Junio C HamanoJan 5, 2007
  41. Junio C HamanoJan 5, 2007
  42. Luben TuikovJan 6, 2007
  43. Luben TuikovJan 6, 2007
  44. Junio C HamanoJan 6, 2007
  45. Luben TuikovJan 1, 2007
  46. J. Bruce FieldsJan 2, 2007
  47. Junio C HamanoJan 2, 2007

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.