Типичный вывод 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
для?