push: require force for annotated tags
Do not allow fast-forwarding of references that point to a tag object. Updating from a tag is potentially destructive since it would likely leave the tag dangling. Disallowing updates to a tag also makes sense semantically and is consistent with the behavior of lightweight tags. Signed-off-by: Chris Rorvick <chris@rorvick.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
dbfeddb12e
commit
40eff17999
11
remote.c
11
remote.c
@ -1281,9 +1281,16 @@ int match_push_refs(struct ref *src, struct ref **dst,
|
||||
|
||||
static inline int is_forwardable(struct ref* ref)
|
||||
{
|
||||
struct object *o;
|
||||
|
||||
if (!prefixcmp(ref->name, "refs/tags/"))
|
||||
return 0;
|
||||
|
||||
/* old object must be a commit */
|
||||
o = parse_object(ref->old_sha1);
|
||||
if (!o || o->type != OBJ_COMMIT)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -1323,8 +1330,8 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
|
||||
* to overwrite it; you would not know what you are losing
|
||||
* otherwise.
|
||||
*
|
||||
* (4) if both new and old are commit-ish, and new is a
|
||||
* descendant of old, it is OK.
|
||||
* (4) if old is a commit and new is a descendant of old
|
||||
* (implying new is commit-ish), it is OK.
|
||||
*
|
||||
* (5) regardless of all of the above, removing :B is
|
||||
* always allowed.
|
||||
|
Reference in New Issue
Block a user