Apakah Git memperingatkan saya jika ID steno dapat merujuk pada 2 komitmen berbeda?

130

Jika cee157dapat merujuk ke 2 ID komit yang berbeda, seperti

cee157eb799af829a9a0c42c0915f55cd29818d4 dan cee1577fecf6fc5369a80bd6e926ac5f864a754b

akankah Git memperingatkan saya jika saya mengetik git log cee157? (atau Git 1.8.5.2 (Apple Git-48) memungkinkan saya untuk mengetik git log cee1).

Saya pikir itu harus, meskipun saya tidak dapat menemukan sumber otoritatif yang mengatakan itu.

nonopolaritas
sumber
4
Lihat man gitrevisions, yang setidaknya menyiratkan peringatan akan diberikan karena menyatakan bahwa Anda dapat memberi nama revisi dengan nama lengkap SHA1-1 atau "substring utama yang unik dalam repositori".
chepner
5
apakah Anda memiliki 17 komitmen berbeda? coba saja git log c... dan lihat.
Djechlin
1
Dalam ELL, saya mungkin akan menandai ini sebagai [referensi umum]
justhalf
3
@ Djechlin Saya membutuhkan setidaknya 4 digit. git log abcmengatakan fatal: ambiguous argument 'abc': unknown revision or path not in the working tree.bahkan jika saya memiliki SHA1 yang unik dimulai dengan abc. Tidak berfungsi dengan 1-2-3 digit, 4 tampaknya menjadi minimum. Diuji pada Windows (1.8.1) dan Mac (1.9.1).
janos
4
@janos Itu karena environment.h mendefinisikan minimum_abbrevke nilai 4.
devnull

Jawaban:

168

Seharusnya memberi Anda sesuatu seperti ini:

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

Saya baru saja menguji ini pada repositori Git yang asli, dengan menemukan commit dengan duplikat awalan seperti ini:

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

Ini membawa daftar revisi master, memotong 4 karakter pertama dan membuang sisanya, menghitung duplikat dan mengurutkan secara numerik. Dalam repositori saya yang relatif kecil dengan ~ 1500 commit, saya menemukan beberapa revisi dengan awalan 4 digit yang umum. Saya memilih awalan 4 digit karena tampaknya merupakan panjang hukum terpendek yang didukung oleh Git. (Tidak bekerja dengan 3 digit atau kurang, meskipun tidak ambigu.)

Btw ini bukan salah ketik, saya tidak tahu mengapa pesan kesalahan tentang SHA1 ambigu muncul dua kali, terlepas dari jumlah duplikat SHA1 (dicoba dengan 2 dan 3):

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

(Keduanya aktif stderr. Sebenarnya seluruh output aktif stderr, tidak ada yang aktif stdout.)

Diuji di Windows:

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

Saya pikir aman untuk mengatakan bahwa jika versi Anda> = 1.8.1, Git akan memperingatkan Anda tentang duplikat. (Ini akan menolak untuk beroperasi dengan duplikat.) Saya kira versi yang jauh lebih tua juga bekerja dengan cara ini.

MEMPERBARUI

Saat menguji ini, Anda memerlukan minimum 4 digit SHA1, karena int minimum_abbrev = 4di environment.c . (Terima kasih @devnull untuk menunjukkannya!)

janos
sumber
5
Apakah kesalahan muncul dua kali bahkan ketika ada lebih dari dua komit dengan awalan yang cocok?
Nit
4
@Tidak, bahkan ketika ada 3 dups, pesan muncul dua kali. Memperbarui jawaban saya untuk menjelaskannya.
janos
1
Mengingat struktur kode sumber git, sepertinya salah satu dari dua output adalah peringatan, dan yang lainnya kesalahan. Tapi tidak pasti.
Izkata
1
@ MarkHurd keduanya di stderr. Sebenarnya seluruh output di stderr, tidak ada di stdout. (Yang masuk akal)
jano
63

Poster asli menyatakan:

Saya pikir itu harus, meskipun saya tidak dapat menemukan sumber otoritatif yang mengatakan itu.

Sumber otoritatif dapat ditemukan dalam kode sumber get_short_sha1() ,.

Mengutip ini :

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

dan ini :

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;

Selain itu, tes juga ada untuk memastikan bahwa fitur berfungsi seperti yang diharapkan.

devnull
sumber