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

Re: can I remove or move a tag in a remote repository?

From
Junio C Hamano <junkio@cox.net>
Date
Nov 28, 2006, 21:46 UTC
Message-ID
<7virgz1bz7.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<87wt5rffbm.fsf@rho.meyering.net>
Jim Meyering <jim@meyering.net> writes:
Show 13 quoted lines
> Here's the problem:
> When I try to push the new tags, git-push fails:
>
>   $ git-push -f --tags ssh+git://git.sv.gnu.org/srv/git/coreutils master:refs/heads/master
>   updating 'refs/tags/cvs-head'
>     from 2fd3fd29a8b40be695bc2327c8cd3bd33e521100
>     to   db18f53ffb221e9957124d8af81c11a7e350ac3b
>   ...
>   Total 1, written 1 (delta 0), reused 0 (delta 0)
>   Unpacking 1 objects
>   error: denying non-fast forward; you should pull first
>
> I get the same error also when using --force.

I think this is due to overeager receive.denyNonFastForwards configuration setting at the repository you are pushing into.

I _think_ what receive-pack does in this case is totally wrong. It should either:

 (1) deny overwriting existing tags -- tags are meant to be
     immutable so it should not allow them to be "updated"
     regardless of fast-forwardness, or
 (2) allow overwriting things under refs/tags/ without any
     fast-forward checking.  After all, a tag could point at a
     tree or a blob, and there is no fast-forwardness among
     trees.

The client side check in "git fetch" takes the latter viewpoint, and I think we should be consistent with it.

Johannes, what do you think? Does the following patch look sane to you?

---
diff --git a/receive-pack.c b/receive-pack.c
index 1a141dc..6c3de47 100644
--- a/receive-pack.c
+++ b/receive-pack.c
@@ -120,7 +120,7 @@ static int update(struct command *cmd)
 			     "but I can't find it!", new_hex);
 	}
 	if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
-	    !is_null_sha1(old_sha1)) {
+	    !is_null_sha1(old_sha1) && !strncmp(name, "refs/heads/", 11)) {
 		struct commit *old_commit, *new_commit;
 		struct commit_list *bases, *ent;
 
Previous: Andreas EricssonNext: Johannes Schindelin
Message 4 of 9 in “can I remove or move a tag in a remote repository?”
  1. Jim MeyeringNov 19, 2006
  2. Jakub NarebskiNov 19, 2006
  3. Andreas EricssonNov 28, 2006
  4. Junio C HamanoNov 28, 2006
  5. Johannes SchindelinNov 29, 2006
  6. Jim MeyeringNov 29, 2006
  7. Johannes SchindelinNov 29, 2006
  8. Jakub NarebskiNov 29, 2006
  9. Andy WhitcroftNov 29, 2006

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.