Git có cảnh báo tôi không nếu một ID cam kết tốc ký có thể đề cập đến 2 cam kết khác nhau?


130

Nếu cee157có thể tham khảo 2 ID cam kết khác nhau, chẳng hạn như

cee157eb799af829a9a0c42c0915f55cd29818d4cee1577fecf6fc5369a80bd6e926ac5f864a754b

Git sẽ cảnh báo tôi nếu tôi gõ vào git log cee157? (hoặc Git 1.8.5.2 (Apple Git-48) cho phép tôi nhập git log cee1).

Tôi nghĩ rằng nó nên, mặc dù tôi không thể tìm thấy bất kỳ nguồn có thẩm quyền nói rằng nó sẽ.


4
Xem man gitrevisions, trong đó ít nhất ngụ ý một cảnh báo sẽ được đưa ra vì nó nói rằng bạn có thể đặt tên một bản sửa đổi với tên SHA1-1 đầy đủ của nó hoặc "một chuỗi con hàng đầu duy nhất trong kho lưu trữ".
chepner

5
Bạn có 17 cam kết khác nhau? hãy thử git log c... và xem.
djechlin

1
Trong ELL, tôi có thể đánh dấu đây là [tham chiếu chung]
cần

3
@djechlin Mình cần ít nhất 4 chữ số. git log abcnói fatal: ambiguous argument 'abc': unknown revision or path not in the working tree.ngay cả khi tôi có một SHA1 duy nhất bắt đầu bằng abc. Không hoạt động với 1-2-3 chữ số, 4 dường như là mức tối thiểu. Đã thử nghiệm trong Windows (1.8.1) và Mac (1.9.1).
janos

4
@janos Đó là bởi vì môi trường.h xác định minimum_abbrevgiá trị của 4.
devnull

Câu trả lời:


168

Nó sẽ cung cấp cho bạn một cái gì đó như thế này:

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

Tôi vừa thử nghiệm điều này trên kho lưu trữ Git thực, bằng cách tìm các xác nhận có tiền tố trùng lặp như thế này:

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

Cái này lấy danh sách các bản sửa đổi master, cắt bỏ 4 ký tự đầu tiên và loại bỏ phần còn lại, đếm các bản sao và sắp xếp số. Trong kho lưu trữ tương đối nhỏ của tôi ~ 1500 cam kết, tôi đã tìm thấy khá nhiều bản sửa đổi với tiền tố 4 chữ số phổ biến. Tôi đã chọn một tiền tố gồm 4 chữ số bởi vì đó dường như là độ dài pháp lý ngắn nhất được Git hỗ trợ. (Không hoạt động với 3 chữ số trở xuống, ngay cả khi không mơ hồ.)

Btw đây không phải là một lỗi đánh máy, tôi không biết tại sao thông báo lỗi về SHA1 mơ hồ xuất hiện hai lần, bất kể số lượng SHA1 trùng lặp (đã thử với 2 và 3):

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

(Cả hai trên stderr. Trên thực tế toàn bộ đầu ra là bật stderr, không có gì trên stdout.)

Đã thử nghiệm trong Windows:

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

Tôi nghĩ thật an toàn khi nói rằng nếu phiên bản của bạn> = 1.8.1, Git sẽ cảnh báo bạn về các bản sao. (Nó sẽ từ chối hoạt động với các bản sao.) Tôi đoán rằng các phiên bản cũ hơn cũng hoạt động theo cách này.

CẬP NHẬT

Khi kiểm tra điều này, bạn cần tối thiểu 4 chữ số SHA1, vì int minimum_abbrev = 4trong môi trường.c . (Cảm ơn @devnull đã chỉ ra điều đó!)


5
Có lỗi xuất hiện hai lần ngay cả khi có nhiều hơn hai lần xác nhận có tiền tố phù hợp không?
Nit

4
@Nit có, ngay cả khi có 3 dups, thông báo xuất hiện hai lần. Cập nhật câu trả lời của tôi để làm rõ điều đó.
janos

1
Với cấu trúc của mã nguồn git, có vẻ như một trong hai đầu ra là một cảnh báo và cái còn lại là một lỗi. Không chắc chắn, mặc dù.
Izkata

1
@MarkHurd cả trên stderr. Trên thực tế, toàn bộ đầu ra là trên thiết bị xuất chuẩn, không có gì trên thiết bị xuất chuẩn. (có ý nghĩa)
janos

63

Các poster gốc nêu:

Tôi nghĩ rằng nó nên, mặc dù tôi không thể tìm thấy bất kỳ nguồn có thẩm quyền nói rằng nó sẽ.

Nguồn có thẩm quyền có thể được tìm thấy trong mã nguồn , get_short_sha1() .

Trích dẫn này :

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

điều này :

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;

Hơn nữa, các thử nghiệm cũng tồn tại để đảm bảo tính năng này hoạt động như mong đợi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.