Типичный вывод git-describe выглядит как
some-tag-32-gf31f980
где some-tag - это имя тега, 32 означает, что описанная фиксация составляет 32 фиксации после фиксации с этим тегом, а gf31f980 означает, что идентификатор фиксации однозначно сокращен до f31f980.
Мой вопрос о g в gf31f980. Почему он там? Моя первая мысль заключалась в том, что он вставлен, чтобы устранить разбор результатов вывода git-describe. Но я не могу придумать ни одного случая, когда это действительно помогает. Например, компонент 32 может быть опущен, и нет никакого способа узнать, что вышеприведенный вывод описывает фиксацию 32 после тэга some-tag, а не фиксацию в теге some-tag-32. Но g не помогает с этим.
Соответствие регулярного выражения для извлечения только идентификатора фиксации может выполнять поиск /-g([0-9a-f]+)$/. Нет простого способа упростить это; вы не можете сделать /-g(.*)$/, например, потому что это может ошибочно соответствовать g в имени тега. Без g вы все равно можете сделать /-([0-9a-f]+)$/, поэтому g вам не поможет. Процессы разбора регулярного выражения будут вести себя аналогичным образом.
g генерируется явно; соответствующий исходный код (вокруг строки 240 из builtin/describe.c):
static void show_suffix(int depth, const unsigned char *sha1)
{
printf("-%d-g%s", depth, find_unique_abbrev(sha1, abbrev));
}
Трудно найти информацию об этом, потому что соответствующий термин g - это секундомер.
Что для g для?