¿Me advierte Git si una ID de confirmación abreviada puede referirse a 2 confirmaciones diferentes?

130

Si cee157puede hacer referencia a 2 ID de confirmación diferentes, como

cee157eb799af829a9a0c42c0915f55cd29818d4 y cee1577fecf6fc5369a80bd6e926ac5f864a754b

¿Git me avisará si escribo git log cee157? (o Git 1.8.5.2 (Apple Git-48) me permite escribir git log cee1).

Creo que debería, aunque no puedo encontrar ninguna fuente autorizada que diga que lo haría.

nonopolaridad
fuente
44
Vea man gitrevisions, lo que al menos implica una advertencia, ya que establece que puede nombrar una revisión con su nombre SHA1-1 completo o "una subcadena principal que es única dentro del repositorio".
chepner
55
¿tienes 17 commits diferentes? solo intenta git log c... y mira.
djechlin
1
En ELL, probablemente marcaría esto como [referencia general]
justo
3
@djechlin Necesito al menos 4 dígitos. git log abcdice fatal: ambiguous argument 'abc': unknown revision or path not in the working tree.incluso si tengo un SHA1 único que comienza con abc. No funciona con 1-2-3 dígitos, 4 parece ser el mínimo. Probado en Windows (1.8.1) y Mac (1.9.1).
janos
44
@janos Eso se debe a que environment.h define minimum_abbrevun valor de 4.
devnull

Respuestas:

168

Debería darte algo como esto:

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

Acabo de probar esto en un repositorio Git real, encontrando confirmaciones con prefijos duplicados como este:

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

Esto incluye la lista de revisiones master, recorta los primeros 4 caracteres y tira el resto, cuenta los duplicados y ordena numéricamente. En mi repositorio relativamente pequeño de ~ 1500 commits encontré bastantes revisiones con un prefijo común de 4 dígitos. Elegí un prefijo de 4 dígitos porque parece ser la longitud legal más corta admitida por Git. (No funciona con 3 dígitos o menos, incluso si no es ambiguo).

Por cierto, esto no fue un error tipográfico, no sé por qué el mensaje de error sobre SHA1 ambiguo aparece dos veces, independientemente de la cantidad de SHA1 duplicado (intentado con 2 y 3):

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

(Ambos stderractivados. En realidad, toda la salida está activada stderr, nada activado stdout).

Probado en Windows:

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

Creo que es seguro decir que si tu versión es> = 1.8.1, Git te avisará de los duplicados. (Se negará a operar con duplicados). Supongo que las versiones mucho más antiguas también funcionaron de esta manera.

ACTUALIZAR

Al probar esto, necesita un mínimo de SHA1 de 4 dígitos, debido a int minimum_abbrev = 4en environment.c . (¡Gracias @devnull por señalar eso!)

janos
fuente
55
¿Aparece el error dos veces incluso cuando hay más de dos confirmaciones con prefijos coincidentes?
Nit
44
@Nit sí, incluso cuando hay 3 dups, el mensaje aparece dos veces. Actualicé mi respuesta para aclarar eso.
janos
1
Dada la estructura del código fuente de git, parece que una de las dos salidas es una advertencia y la otra un error. Sin embargo, no estoy seguro.
Izkata
1
@MarkHurd ambos en stderr. En realidad, toda la salida está en stderr, nada en stdout. (lo cual tiene sentido)
janos
63

El cartel original dice:

Creo que debería, aunque no puedo encontrar ninguna fuente autorizada que diga que lo haría.

La fuente autorizada se puede encontrar en el código fuente, get_short_sha1() .

Citando esto :

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

y esto :

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;

Además, también existen pruebas para garantizar que la función funcione como se espera.

devnull
fuente