Предупреждает ли меня Git, если сокращенный идентификатор фиксации может относиться к двум разным коммитам?

130

Если cee157можно ссылаться на 2 разных идентификатора фиксации, например

cee157eb799af829a9a0c42c0915f55cd29818d4 и cee1577fecf6fc5369a80bd6e926ac5f864a754b

Git предупредит меня, если я введу код git log cee157? (или Git 1.8.5.2 (Apple Git-48) позволяет мне вводить текст git log cee1).

Я думаю, что должен, хотя я не могу найти ни одного авторитетного источника, который бы сказал, что это будет.

nonopolarity
источник
4
Смотрите man gitrevisions, что, по крайней мере, подразумевает, что будет выдано предупреждение, поскольку в нем говорится, что вы можете назвать ревизию ее полным именем SHA1-1 или «ведущей подстрокой, которая уникальна в репозитории».
chepner
5
у вас есть 17 разных коммитов? просто попробуй git log c... и увидишь.
djechlin
1
В ELL я бы, вероятно,
пометил
3
@djechlin Мне нужно как минимум 4 цифры. git log abcговорит, что fatal: ambiguous argument 'abc': unknown revision or path not in the working tree.даже если у меня есть уникальный SHA1, начиная с abc. Не работает с 1-2-3 цифрами, 4 вроде как минимум. Проверено в Windows (1.8.1) и Mac (1.9.1).
janos
4
@janos Это потому, что environment.h определяет minimum_abbrevзначение 4.
devnull

Ответы:

168

Это должно дать вам что-то вроде этого:

$ git log cee157
error: short SHA1 cee157 is ambiguous.
error: short SHA1 cee157 is ambiguous.
fatal: ambiguous argument 'cee157': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Я только что протестировал это в реальном репозитории Git, найдя коммиты с повторяющимися префиксами, например:

git rev-list master | cut -c-4 | sort | uniq -c | sort -nr | head

Это берет список ревизий master, вырезает первые 4 символа и отбрасывает остальные, подсчитывает дубликаты и сортирует численно. В моем относительно небольшом репозитории ~ 1500 коммитов я нашел довольно много ревизий с общим 4-значным префиксом. Я выбрал 4-значный префикс, потому что это самая короткая допустимая длина, поддерживаемая Git. (Не работает с 3-мя и менее цифрами, даже если это не двусмысленно.)

Кстати, это не была опечатка, я не знаю, почему сообщение об ошибке о неоднозначном SHA1 появляется дважды, независимо от количества дублированных SHA1 (пробовал с 2 и 3):

error: short SHA1 cee157 is ambiguous.
error: short SHA1 cee157 is ambiguous.

(Оба stderrвключены. На самом деле весь выход включенstderr , ничего не горит stdout.)

Проверено в Windows:

$ git --version
git version 1.8.1.msysgit.1

Я думаю, можно с уверенностью сказать, что если ваша версия> = 1.8.1, Git будет предупреждать вас о дубликатах. (Он откажется работать с дубликатами.) Я предполагаю, что более старые версии тоже работали таким образом.

ОБНОВИТЬ

При тестировании вам понадобится как минимум 4-значный SHA1 из-за int minimum_abbrev = 4in environment.c . (Спасибо @devnull за указание на это!)

Янош
источник
5
Ошибка появляется дважды, даже если есть более двух коммитов с совпадающими префиксами?
Nit
4
@Nit да, даже когда есть 3 дуппа, сообщение появляется дважды. Обновил мой ответ, чтобы прояснить это.
janos
1
Учитывая структуру исходного кода git, похоже, что один из двух выходов является предупреждением, а другой - ошибкой. Хотя не уверен.
Изката
1
@MarkHurd как на stderr. На самом деле весь вывод находится на stderr, ничего - на stdout. (что имеет смысл)
janos
63

Оригинальный плакат гласит:

Я думаю, что должен, хотя я не могу найти ни одного авторитетного источника, который бы сказал, что это будет.

Авторитетный источник можно найти в исходном коде, get_short_sha1() .

Цитируя это :

if (!quietly && (status == SHORT_NAME_AMBIGUOUS))
    return error("short SHA1 %.*s is ambiguous.", len, hex_pfx);

и это :

if (!ds->candidate_checked)
    /*
     * If this is the only candidate, there is no point
     * calling the disambiguation hint callback.
     *
     * On the other hand, if the current candidate
     * replaced an earlier candidate that did _not_ pass
     * the disambiguation hint callback, then we do have
     * more than one objects that match the short name
     * given, so we should make sure this one matches;
     * otherwise, if we discovered this one and the one
     * that we previously discarded in the reverse order,
     * we would end up showing different results in the
     * same repository!
     */
    ds->candidate_ok = (!ds->disambiguate_fn_used ||
                        ds->fn(ds->candidate, ds->cb_data));

if (!ds->candidate_ok)
    return SHORT_NAME_AMBIGUOUS;

Более того, существуют также тесты, чтобы убедиться, что функция работает должным образом.

devnull
источник