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;