Чи попереджає мене Git, якщо ідентифікатор скороченої комісії може посилатися на 2 різні коміти?


130

Якщо cee157можна посилатися на 2 різних посвідчення комісій, таких як

cee157eb799af829a9a0c42c0915f55cd29818d4 і cee1577fecf6fc5369a80bd6e926ac5f864a754b

чи попередить мене Гіт, якщо я ввійду git log cee157? (або Git 1.8.5.2 (Apple Git-48) дозволяє мені вводити git log cee1).

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


4
Дивіться man gitrevisions, що принаймні передбачає попередження, оскільки воно вказує, що ви можете назвати редакцію з повним ім'ям SHA1-1 або "провідним підрядком, унікальним у сховищі".
чепнер

5
у вас 17 різних комітетів? просто спробуйте git log c... і подивіться.
дічлін

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 буде попереджати вас про дублікатах. (Він відмовиться працювати з дублікатами.) Я б здогадався, що набагато старіші версії працювали і таким чином.

ОНОВЛЕННЯ

При тестуванні цього вам потрібно мінімум чотиризначний SHA1, оскільки він int minimum_abbrev = 4знаходиться в середовищі.c . (Дякую @devnull за те, що вказав на це!)


5
Чи з’являється помилка двічі навіть тоді, коли є більше двох комітів із відповідними префіксами?
Ніт

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;

Більше того, існують також тести, щоб забезпечити роботу функції, як очікувалося.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.