@@ -435,12 +435,31 @@ static int get_sha1_1(const char *name, int len, unsigned char *sha1, unsigned l
435435static int get_sha1_basic (const char * str , int len , unsigned char * sha1 )
436436{
437437 static const char * warn_msg = "refname '%.*s' is ambiguous." ;
438+ static const char * object_name_msg = N_ (
439+ "Git normally never creates a ref that ends with 40 hex characters\n"
440+ "because it will be ignored when you just specify 40-hex. These refs\n"
441+ "may be created by mistake. For example,\n"
442+ "\n"
443+ " git checkout -b $br $(git rev-parse ...)\n"
444+ "\n"
445+ "where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
446+ "examine these refs and maybe delete them. Turn this message off by\n"
447+ "running \"git config advice.object_name_warning false\"" );
448+ unsigned char tmp_sha1 [20 ];
438449 char * real_ref = NULL ;
439450 int refs_found = 0 ;
440451 int at , reflog_len ;
441452
442- if (len == 40 && !get_sha1_hex (str , sha1 ))
453+ if (len == 40 && !get_sha1_hex (str , sha1 )) {
454+ refs_found = dwim_ref (str , len , tmp_sha1 , & real_ref );
455+ if (refs_found > 0 && warn_ambiguous_refs ) {
456+ warning (warn_msg , len , str );
457+ if (advice_object_name_warning )
458+ fprintf (stderr , "%s\n" , _ (object_name_msg ));
459+ }
460+ free (real_ref );
443461 return 0 ;
462+ }
444463
445464 /* basic@{time or number or -number} format to query ref-log */
446465 reflog_len = at = 0 ;
@@ -481,7 +500,9 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
481500 if (!refs_found )
482501 return -1 ;
483502
484- if (warn_ambiguous_refs && refs_found > 1 )
503+ if (warn_ambiguous_refs &&
504+ (refs_found > 1 ||
505+ !get_short_sha1 (str , len , tmp_sha1 , GET_SHA1_QUIETLY )))
485506 warning (warn_msg , len , str );
486507
487508 if (reflog_len ) {
0 commit comments