path: root/commit.c
diff options
authorNguyễn Thái Ngọc Duy <>2011-09-17 11:57:45 (GMT)
committerJunio C Hamano <>2011-09-18 21:11:40 (GMT)
commitbaf18fc261ca475343fe3cb9cd2c0dded4bc1bb7 (patch)
tree666474a67f25d9906b2eace5692d1613beab21a6 /commit.c
parent894642f68d3160db9116ca350da83c4a78cff8f2 (diff)
Accept tags in HEAD or MERGE_HEAD
HEAD and MERGE_HEAD (among other branch tips) should never hold a tag. That can only be caused by broken tools and is cumbersome to fix by an end user with: $ git update-ref HEAD $(git rev-parse HEAD^{commit}) which may look like a magic to a new person. Be easy, warn users (so broken tools can be fixed if they bother to report) and move on. Be robust, if the given SHA-1 cannot be resolved to a commit object, die (therefore return value is always valid). Signed-off-by: Nguyễn Thái Ngọc Duy <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'commit.c')
1 files changed, 12 insertions, 0 deletions
diff --git a/commit.c b/commit.c
index ac337c7..50fcf96 100644
--- a/commit.c
+++ b/commit.c
@@ -39,6 +39,18 @@ struct commit *lookup_commit_reference(const unsigned char *sha1)
return lookup_commit_reference_gently(sha1, 0);
+struct commit *lookup_commit_or_die(const unsigned char *sha1, const char *ref_name)
+ struct commit *c = lookup_commit_reference(sha1);
+ if (!c)
+ die(_("could not parse %s"), ref_name);
+ if (hashcmp(sha1, c->object.sha1)) {
+ warning(_("%s %s is not a commit!"),
+ ref_name, sha1_to_hex(sha1));
+ }
+ return c;
struct commit *lookup_commit(const unsigned char *sha1)
struct object *obj = lookup_object(sha1);