Warnt mich Git, wenn eine Kurzschrift-Commit-ID auf zwei verschiedene Commits verweisen kann?

130

Wenn cee157kann auf 2 verschiedene Commit-IDs verweisen, wie z

cee157eb799af829a9a0c42c0915f55cd29818d4 und cee1577fecf6fc5369a80bd6e926ac5f864a754b

Wird Git mich warnen, wenn ich tippe git log cee157? (oder Git 1.8.5.2 (Apple Git-48) ermöglicht mir das Eingeben git log cee1).

Ich denke, es sollte, obwohl ich keine maßgebliche Quelle finden kann, die dies verspricht.

Unpolarität
quelle
4
Sehen Sie man gitrevisions, was zumindest impliziert, dass eine Warnung ausgegeben wird, da angegeben wird, dass Sie eine Revision mit ihrem vollständigen SHA1-1-Namen oder "einem führenden Teilstring, der innerhalb des Repositorys eindeutig ist" benennen können.
Chepner
5
Hast du 17 verschiedene Commits? versuchen Sie es einfach git log c... und sehen Sie.
Djechlin
1
In ELL würde ich dies wahrscheinlich als [allgemeine Referenz]
kennzeichnen
3
@ Djechlin Ich brauche mindestens 4 Ziffern. git log abcsagt fatal: ambiguous argument 'abc': unknown revision or path not in the working tree.auch wenn ich einen einzigartigen SHA1 habe, der mit beginnt abc. Funktioniert nicht mit 1-2-3 Ziffern, 4 scheint das Minimum zu sein. Getestet in Windows (1.8.1) und Mac (1.9.1).
Janos
4
@janos denn das ist environment.h definiert minimum_abbrevauf einen Wert von 4.
devnull

Antworten:

168

Es sollte Ihnen so etwas geben:

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

Ich habe dies gerade in einem echten Git-Repository getestet, indem ich Commits mit doppelten Präfixen wie diesem gefunden habe:

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

Dies nimmt die Liste der Revisionen auf master, schneidet die ersten 4 Zeichen aus und wirft den Rest weg, zählt die Duplikate und sortiert numerisch. In meinem relativ kleinen Repository mit ~ 1500 Commits habe ich einige Revisionen mit einem gemeinsamen 4-stelligen Präfix gefunden. Ich habe ein 4-stelliges Präfix gewählt, da dies die kürzeste legale Länge zu sein scheint, die von Git unterstützt wird. (Funktioniert nicht mit 3 oder weniger Ziffern, auch wenn dies nicht mehrdeutig ist.)

Übrigens war dies kein Tippfehler, ich weiß nicht, warum die Fehlermeldung über mehrdeutiges SHA1 zweimal erscheint, unabhängig von der Anzahl der doppelten SHA1 (versucht mit 2 und 3):

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

(Beide eingeschaltet stderr. Eigentlich ist der gesamte Ausgang eingeschaltet stderr, nichts eingeschaltet stdout.)

In Windows getestet:

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

Ich denke , es ist sicher zu sagen , dass , wenn Ihre Version> = 1.8.1, Git werden Sie von Duplikaten warnen. (Es wird sich weigern, mit Duplikaten zu arbeiten.) Ich würde vermuten, dass viel ältere Versionen auch so funktionierten.

AKTUALISIEREN

Wenn Sie dies testen, benötigen Sie aufgrund von int minimum_abbrev = 4in environment.c mindestens 4-stelliges SHA1 . (Danke @devnull für den Hinweis!)

Janos
quelle
5
Erscheint der Fehler zweimal, selbst wenn mehr als zwei Commits mit übereinstimmenden Präfixen vorhanden sind?
Nit
4
@Nit ja, auch wenn es 3 Dups gibt, erscheint die Meldung zweimal. Meine Antwort wurde aktualisiert, um dies zu verdeutlichen.
Janos
1
Angesichts der Struktur des Git-Quellcodes sieht es so aus, als wäre einer der beiden Ausgänge eine Warnung und der andere ein Fehler. Ich bin mir jedoch nicht sicher.
Izkata
1
@ MarkHurd beide auf stderr. Eigentlich ist die gesamte Ausgabe auf stderr, nichts auf stdout. (was Sinn macht)
Janos
63

Das Originalplakat besagt:

Ich denke, es sollte, obwohl ich keine maßgebliche Quelle finden kann, die dies verspricht.

Die maßgebliche Quelle finden Sie im Quellcode get_short_sha1() .

Zitiert dies :

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

und das :

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;

Darüber hinaus gibt es auch Tests , um sicherzustellen, dass die Funktion wie erwartet funktioniert.

devnull
quelle