diff options
author | Chris Rorvick <chris@rorvick.com> | 2012-11-29 19:41:39 -0600 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-12-02 01:45:13 -0800 |
commit | 80054cf9d53aad76631797d76ce33a56c855c61a (patch) | |
tree | e09b18a69c081bba660785c9f9ec19c5e6ec62fe /remote.c | |
parent | 40eff1799983b958d6dbe09fb499ad505bcf6f8d (diff) | |
download | git-80054cf9d53aad76631797d76ce33a56c855c61a.tar.gz git-80054cf9d53aad76631797d76ce33a56c855c61a.tar.xz |
push: clarify rejection of update to non-commit-ish
Pushes must already (by default) update to a commit-ish due to the fast-
forward check in set_ref_status_for_push(). But rejecting for not being
a fast-forward suggests the situation can be resolved with a merge.
Flag these updates (i.e., to a blob or a tree) as not forwardable so the
user is presented with more appropriate advice.
While updating *from* a tag object is potentially destructive, updating
*to* a tag is not. Additionally, a push to the refs/tags/ hierarchy is
already excluded from fast-forwarding, and refs/heads/ is protected from
anything but commit objects by a check in write_ref_sha1(). Thus
someone fast-forwarding to a tag is probably not doing so by accident.
Since updating to a tag is benign and unlikely to cause confusion, allow
it in case someone finds the behavior useful.
Signed-off-by: Chris Rorvick <chris@rorvick.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'remote.c')
-rw-r--r-- | remote.c | 5 |
1 files changed, 5 insertions, 0 deletions
@@ -1291,6 +1291,11 @@ static inline int is_forwardable(struct ref* ref) if (!o || o->type != OBJ_COMMIT) return 0; + /* new object must be commit-ish */ + o = deref_tag(parse_object(ref->new_sha1), NULL, 0); + if (!o || o->type != OBJ_COMMIT) + return 0; + return 1; } |