Bir steno commit ID'si 2 farklı commit'i ifade edebiliyorsa Git beni uyarır mı?


130

Eğer cee1572 farklı başvurabilirsiniz gibi kimlikleri, taahhüt

cee157eb799af829a9a0c42c0915f55cd29818d4 ve cee1577fecf6fc5369a80bd6e926ac5f864a754b

Yazarsam Git beni uyaracak git log cee157mı? (veya Git 1.8.5.2 (Apple Git-48) yazmama izin veriyor git log cee1).

Olacağını söyleyen yetkili bir kaynak bulamasam da öyle olmalı diye düşünüyorum.


4
Bakın man gitrevisions, bu, en azından bir uyarının verileceğini ima eder, çünkü bir revizyonu tam SHA1-1 adıyla veya "havuz içinde benzersiz olan baştaki bir alt dizeyle" adlandırabileceğinizi belirtir.
chepner

5
17 farklı kaydınız var mı? sadece dene git log c... ve gör.
djechlin

1
ELL'de

3
@djechlin En az 4 haneye ihtiyacım var. ile başlayan benzersiz bir SHA1 olsa bile git log abcdiyor . 1-2-3 rakamlarla çalışmıyor, minimum 4 gibi görünüyor. Windows (1.8.1) ve Mac'te (1.9.1) test edilmiştir. fatal: ambiguous argument 'abc': unknown revision or path not in the working tree.abc
janos

4
@janos Bunun nedeni, environment.h'ninminimum_abbrev bir değer olarak tanımlamasıdır 4.
devnull

Yanıtlar:


168

Size şöyle bir şey vermeli:

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

Bunu, aşağıdaki gibi yinelenen önekler içeren commit'leri bularak gerçek bir Git deposunda test ettim:

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

Bu, revizyonların listesini alır, masterilk 4 karakteri çıkarır ve geri kalanını atar, kopyaları sayar ve sayısal olarak sıralar. Nispeten küçük bir ~ 1500 işlemden oluşan depomda, yaygın bir 4 basamaklı önekle epeyce revizyon buldum. Git tarafından desteklenen en kısa yasal uzunluk olduğu için 4 basamaklı bir önek seçtim. (Belirsiz olmasa bile 3 basamak veya daha azıyla çalışmaz.)

Btw bu bir yazım hatası değildi, belirsiz SHA1 ile ilgili hata mesajının, yinelenen SHA1 sayısından bağımsız olarak neden iki kez göründüğünü bilmiyorum (2 ve 3 ile denendi):

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

(İkisi de açık stderr. Aslında çıktının tamamı açık stderr, hiçbir şey açık değil stdout.)

Windows'ta test edildi:

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

Sürümünüz> = 1.8.1 ise Git'in sizi kopyalar konusunda uyaracağını söylemenin güvenli olduğunu düşünüyorum . (Kopyalarla çalışmayı reddedecektir.) Tahmin ediyorum ki çok daha eski sürümler de bu şekilde çalışıyordu.

GÜNCELLEME

Bu test yaparken, çünkü, 4 basamaklı SHA1 en az gerekir int minimum_abbrev = 4içinde environment.c . ( Bunu belirttiğiniz için teşekkürler @ devnull !)


5
Eşleşen öneklere sahip ikiden fazla kaydetme olsa bile hata iki kez mi görünüyor?
Nit

4
@Nit evet, 3 dupe olsa bile mesaj iki kez görünür. Bunu netleştirmek için cevabımı güncelledim.
Janos

1
Git kaynak kodunun yapısı göz önüne alındığında, iki çıktıdan biri bir uyarı, diğeri bir hata gibi görünüyor. Yine de kesin değil.
Izkata

1
@MarkHurd her ikisi de stderr'de. Aslında çıktının tamamı stderr üzerindedir, standart çıktıda hiçbir şey yoktur. (ki burada mantıklı)
Janos'un

63

Orijinal poster şunları belirtir:

Olacağını söyleyen yetkili bir kaynak bulamasam da öyle olmalı diye düşünüyorum.

Yetkili kaynak, kaynak kodunda bulunabilir get_short_sha1() .

Bunu alıntı yapmak :

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

ve bu :

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;

Dahası, testler özelliğin beklendiği gibi çalıştığından emin olmak için de mevcuttur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.