속기 커밋 ID가 두 개의 다른 커밋을 나타낼 수 있다면 Git에서 경고합니까?


130

다음 cee157과 같은 2 개의 다른 커밋 ID를 참조 할 수있는 경우

cee157eb799af829a9a0c42c0915f55cd29818d4cee1577fecf6fc5369a80bd6e926ac5f864a754b

입력하면 Git에서 경고 git log cee157합니까? (또는 Git 1.8.5.2 (Apple Git-48)를 사용하면 입력 할 수 있습니다 git log cee1).

나는 그것이 권위있는 출처를 찾을 수는 없지만 그래야한다고 생각합니다.


4
보기 man gitrevisions당신은 그것의 전체 SHA1-1 이름 또는 "저장소 내에서 고유 선도적 인 문자열"로 개정 이름을 수 있다고 때문에 적어도 경고가 주어집니다 의미한다.
chepner

5
17 개의 커밋이 있습니까? 그냥 시도 git log c하고 참조하십시오.
djechlin

1
ELL, 난으로이 플래그를 아마 것 [일반 참조]
justhalf

3
@ djechlin 적어도 4 자리가 필요합니다. git log abc라고 fatal: ambiguous argument 'abc': unknown revision or path not in the working tree.나는 독특한 SHA1으로 시작하는 경우에도 abc. 1-2-3 자리 숫자로는 작동하지 않습니다. 4가 최소값 인 것 같습니다. Windows (1.8.1) 및 Mac (1.9.1)에서 테스트되었습니다.
janos

4
@janos 그것은 environment.hminimum_abbrev 가 값으로 정의 하기 때문 이다 4.
devnull

답변:


168

그것은 당신에게 다음과 같은 것을 줄 것입니다 :

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

방금 다음과 같이 중복 접두사가있는 커밋을 찾아 실제 Git 저장소에서 이것을 테스트했습니다.

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

이것은의 개정 목록을 가져 와서 master처음 4자를 잘라 내고 나머지는 버리고 복제본을 세고 숫자로 정렬합니다. ~ 1500 커밋의 상대적으로 작은 저장소에서 일반적인 4 자리 접두사가있는 수정본이 상당히 많았습니다. Git에서 지원하는 가장 짧은 법적 길이 인 것 같아서 4 자리 접두사를 선택했습니다. (모호하지 않더라도 3 자리 이하로 작동하지 않습니다.)

그러나 이것은 오타가 아니기 때문에 중복 SHA1 (2와 3으로 시도)의 수에 관계없이 모호한 SHA1에 대한 오류 메시지가 두 번 나타나는 이유를 모르겠습니다.

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

(모두 켜짐 stderr. 실제로 전체 출력은 켜져 stderr있지만 아무것도 켜지지 않습니다 stdout.)

Windows에서 테스트 :

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

버전이 1.8.1 이상인 경우 Git 중복에 대해 경고 한다고 말하는 것이 안전하다고 생각합니다 . (복제본으로 작동하지 않을 것입니다.) 훨씬 오래된 버전도 이런 식으로 작동했다고 생각합니다.

최신 정보

이 테스트 할 때, 당신은 때문에, 4 자리 SHA1의 최소 필요 int minimum_abbrev = 4environment.c . ( 그것을 지적 해 준 @devnull 에게 감사드립니다 !)


5
접두사가 일치하는 커밋이 두 개 이상인 경우에도 오류가 두 번 나타 납니까?
Nit

4
@Nit 예. 3 개의 딥이 있어도 메시지가 두 번 나타납니다. 그것을 명확히하기 위해 내 대답을 업데이트했습니다.
janos

1
git 소스 코드의 구조를 감안할 때, 두 출력 중 하나는 경고이고 다른 하나는 오류 인 것처럼 보입니다. 그러나 확실하지 않습니다.
이즈 카타

1
@ MarkHurd 모두 stderr에 있습니다. 실제로 전체 출력은 stderr에 있고 stdout에는 없습니다. (이것이 의미가 있습니다)
janos

63

원래 포스터는 다음과 같이 말합니다.

나는 그것이 권위있는 출처를 찾을 수는 없지만 그래야한다고 생각합니다.

신뢰할 수있는 소스는 소스 코드에서 찾을 수 있습니다 get_short_sha1() .

인용 :

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

그리고 이것 :

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;

또한 기능이 예상대로 작동하는지 테스트 하기도합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.