省略形のコミットIDが2つの異なるコミットを参照できる場合、Gitは警告を出しますか?


130

次のcee157ような2つの異なるコミットIDを参照できる場合

cee157eb799af829a9a0c42c0915f55cd29818d4 そして cee1577fecf6fc5369a80bd6e926ac5f864a754b

入力するとGitから警告が表示されgit log cee157ますか?(またはGit 1.8.5.2(Apple Git-48)では、と入力できますgit log cee1)。

私はそれがそうであると言う信頼できる情報源を見つけることができませんが、私はそれはそうすべきだと思います。


4
を参照してくださいman gitrevisions。これは、リビジョンに完全なSHA1-1名または「リポジトリ内で一意の先頭のサブストリング」を使用して名前を付けることができると記載されているため、少なくとも警告が表示されることを意味します。
chepner 2014年

5
17種類のコミットがありますか?git log c... 試してみてください。
djechlin 2014年

1
ELLでは、おそらくこれを[一般参照]としてフラグを立てます
14年

3
@djechlin少なくとも4桁必要です。git log abc言うfatal: ambiguous argument 'abc': unknown revision or path not in the working tree.私が始まるユニークなSHA1を持っている場合でもabc。1-2桁では機能しません。4が最小のようです。Windows(1.8.1)およびMac(1.9.1)でテスト済み。
janos 2014年

4
@janosこれは、environment.hminimum_abbrevがの値に定義されているためです4
devnull 2014年

回答:


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桁の接頭辞を持つかなりの数のリビジョンを見つけました。4桁のプレフィックスを選択したのは、それがGitでサポートされている最も短い法的な長さのようだからです。(あいまいでなくても、3桁以下では機能しません。)

ところで、これはタイプミスではありませんでした。重複するSHA1の数に関係なく、あいまいなSHA1に関するエラーメッセージが2回表示される理由はわかりません(2と3で試してみました)。

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 重複警告すると言っても安全だと思います。(重複して動作することを拒否します。)以前のバージョンの多くもこのように機能したと思います。

更新

これをテストするときはint minimum_abbrev = 4environment.cのため、4桁以上のSHA1が必要です。(それを指摘してくれた@devnullに感謝!)


5
プレフィックスが一致するコミットが3つ以上ある場合でも、エラーは2回表示されますか?
2014年

4
@はいはい、3回の繰り返しがある場合でも、メッセージは2回表示されます。それを明確にするために私の答えを更新しました。
janos 2014年

1
gitソースコードの構造を考えると、2つの出力の1つは警告で、もう1つはエラーのように見えます。確かではありません。
イズカタ、2014年

1
stderr上の@MarkHurdの両方。実際、出力全体はstderrにあり、stdoutにはありません。(これは理にかなっています)
janos 2014年

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.