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

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

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Oct 13, 2008, 09:36 UTC
Message-ID
<alpine.DEB.1.00.0810131129110.22125@pacific.mpi-cbg.de.mpi-cbg.de>
In-Reply-To
<alpine.LNX.1.00.0810121501590.19665@iabervon.org>

Some confusing tutorials suggested that it would be a good idea to fetch into the current branch with something like this:

	git fetch origin master:master

(or even worse: the same command line with "pull" instead of "fetch"). While it might make sense to store what you want to pull, it typically is plain wrong when the current branch is "master".

As noticed by Junio, this behavior should be triggered by _not_ passing the --update-head-ok option, but somewhere along the lines we lost that behavior.

NOTE: this patch does not completely resurrect the original behavior
without --update-head-ok: the check for the current branch is now _only_
performed in non-bare repositories.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
	On Sun, 12 Oct 2008, Daniel Barkalow and Shawn Pearce sent some 
	good suggestions to fix the first version of the patch.
	This is the updated version.  In particular, the test is only 
	performed without the option "--update-head-ok", the function 
	branch_get(NULL) is called to get the current branch, a test was 
	added to verify that --update-head-ok works as expected, and the 
	commit message was modified in the hope that it confuses less now.
	Strangely, some more tests refused to pass this time, because they
	did not use --update-head-ok; this was fixed, too.
 builtin-fetch.c             |   15 +++++++++++++++
 t/t5405-send-pack-rewind.sh |    2 +-
 t/t5505-remote.sh           |    2 +-
 t/t5510-fetch.sh            |   12 ++++++++++++
 t/t9300-fast-import.sh      |    2 +-
 5 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/builtin-fetch.c b/builtin-fetch.c
index ee93d3a..57c161d 100644
--- a/builtin-fetch.c
+++ b/builtin-fetch.c
@@ -534,6 +534,19 @@ static void find_non_local_tags(struct transport *transport,
 	string_list_clear(&new_refs, 0);
 }
 
+static void check_not_current_branch(struct ref *ref_map)
+{
+	struct branch *current_branch = branch_get(NULL);
+
+	if (is_bare_repository() || !current_branch)
+		return;
+
+	for (; ref_map; ref_map = ref_map->next)
+		if (ref_map->peer_ref && !strcmp(current_branch->refname,
+					ref_map->peer_ref->name))
+			die("Refusing to fetch into current branch");
+}
+
 static int do_fetch(struct transport *transport,
 		    struct refspec *refs, int ref_count)
 {
@@ -558,6 +571,8 @@ static int do_fetch(struct transport *transport,
 	}
 
 	ref_map = get_ref_map(transport, refs, ref_count, tags, &autotags);
+	if (!update_head_ok)
+		check_not_current_branch(ref_map);
 
 	for (rm = ref_map; rm; rm = rm->next) {
 		if (rm->peer_ref)
diff --git a/t/t5405-send-pack-rewind.sh b/t/t5405-send-pack-rewind.sh
index 86abc62..cb9aacc 100755
--- a/t/t5405-send-pack-rewind.sh
+++ b/t/t5405-send-pack-rewind.sh
@@ -12,7 +12,7 @@ test_expect_success setup '
 	mkdir another && (
 		cd another &&
 		git init &&
-		git fetch .. master:master
+		git fetch --update-head-ok .. master:master
 	) &&
 
 	>file2 && git add file2 && test_tick &&
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index c449663..0103e1a 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh
@@ -188,7 +188,7 @@ test_expect_success 'prune --dry-run' '
 test_expect_success 'add --mirror && prune' '
 	(mkdir mirror &&
 	 cd mirror &&
-	 git init &&
+	 git init --bare &&
 	 git remote add --mirror -f origin ../one) &&
 	(cd one &&
 	 git branch -m side2 side) &&
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index 9aae496..9e679b4 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -323,4 +323,16 @@ test_expect_success 'auto tag following fetches minimum' '
 	)
 '
 
+test_expect_success 'refuse to fetch into the current branch' '
+
+	test_must_fail git fetch . side:master
+
+'
+
+test_expect_success 'fetch into the current branch with --update-head-ok' '
+
+	git fetch --update-head-ok . side:master
+
+'
+
 test_done
diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh
index 328444a..91b5ace 100755
--- a/t/t9300-fast-import.sh
+++ b/t/t9300-fast-import.sh
@@ -983,7 +983,7 @@ test_expect_success \
 	 git checkout subuse1 &&
 	 rm -rf sub && mkdir sub && cd sub &&
 	 git init &&
-	 git fetch .. refs/heads/sub:refs/heads/master &&
+	 git fetch --update-head-ok .. refs/heads/sub:refs/heads/master &&
 	 git checkout master &&
 	 cd .. &&
 	 git submodule init &&
-- 
1.6.0.2.749.g0cc32
Previous: Daniel BarkalowNext: Shawn O. Pearce
Message 7 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.