O Git me avisa se um ID de confirmação abreviado pode se referir a 2 confirmações diferentes?

130

Se cee157pode se referir a 2 IDs de confirmação diferentes, como

cee157eb799af829a9a0c42c0915f55cd29818d4 e cee1577fecf6fc5369a80bd6e926ac5f864a754b

o Git vai me avisar se eu digitar git log cee157? (ou Git 1.8.5.2 (Apple Git-48) permite que eu digite git log cee1).

Eu acho que deveria, apesar de não encontrar nenhuma fonte autorizada que afirme que sim.

falta de polaridade
fonte
4
Veja man gitrevisions, o que pelo menos implica em um aviso, será dado, uma vez que afirma que você pode nomear uma revisão com o nome completo do SHA1-1 ou "uma substring principal que é exclusiva no repositório".
Chepner # 6/14
5
você tem 17 commits diferentes? apenas tente git log c... e veja.
djechlin
1
No ELL, eu provavelmente sinalizaria isso como [referência geral]
justhalf
3
@djechlin Preciso de pelo menos 4 dígitos. git log abcdiz fatal: ambiguous argument 'abc': unknown revision or path not in the working tree.mesmo que eu tenha um SHA1 exclusivo começando com abc. Não funciona com 1-2-3 dígitos, 4 parece ser o mínimo. Testado no Windows (1.8.1) e Mac (1.9.1).
janos 07/05
4
@janos Isso ocorre porque environment.h define minimum_abbrevum valor de 4.
devnull

Respostas:

168

Deve dar-lhe algo como isto:

$ 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>...]'

Acabei de testar isso em um repositório Git real, encontrando confirmações com prefixos duplicados como este:

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

Isso pega a lista de revisões master, corta os 4 primeiros caracteres e joga fora o resto, conta as duplicatas e classifica numericamente. Em um repositório relativamente pequeno de ~ 1500 confirmações, encontrei algumas revisões com um prefixo comum de 4 dígitos. Eu escolhi um prefixo de 4 dígitos porque esse parece ser o menor comprimento legal suportado pelo Git. (Não funciona com 3 dígitos ou menos, mesmo que não seja ambíguo.)

Btw não foi um erro de digitação, não sei por que a mensagem de erro sobre SHA1 ambíguo aparece duas vezes, independentemente do número de SHA1 duplicado (tentado com 2 e 3):

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

(Ambos stderrativados. Na verdade, toda a saída está ativada stderr, nada ativado stdout.)

Testado no Windows:

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

Eu acho que é seguro dizer que, se a sua versão é> = 1.8.1, Git irá avisá-lo de duplicatas. (Ele se recusará a operar com duplicatas.) Eu acho que versões muito mais antigas também funcionavam dessa maneira.

ATUALIZAR

Ao testar isso, você precisa de um mínimo de SHA1 de 4 dígitos, devido int minimum_abbrev = 4ao ambiente.c . (Obrigado @devnull por apontar isso!)

janos
fonte
5
O erro aparece duas vezes, mesmo quando há mais de duas confirmações com prefixos correspondentes?
Nit
4
@Não, sim, mesmo quando existem 3 dups, a mensagem aparece duas vezes. Atualizei minha resposta para esclarecer isso.
janos
1
Dada a estrutura do código-fonte git, parece que uma das duas saídas é um aviso e a outra um erro. Não tenho certeza, no entanto.
Izkata
1
@ MarkHurd ambos no stderr. Na verdade, toda a saída está no stderr, nada no stdout. (o que faz sentido)
janos
63

O pôster original declara:

Eu acho que deveria, apesar de não encontrar nenhuma fonte autorizada que afirme que sim.

A fonte autorizada pode ser encontrada no código fonte get_short_sha1() ,.

Citando isto :

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

e isso :

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;

Além disso, também existem testes para garantir que o recurso funcione conforme o esperado.

devnull
fonte