注:git rev-parse --short
最短かつユニークなSHA1を要求できます。
「を参照してください。定期的なハッシュから短いハッシュを取得するGIT」
git rev-parse --short=4 921103db8259eb9de72f42db8b939895f5651489
92110
私の例でわかるように、長さを4に指定しても、SHA1の長さは5です。
大きなリポジトリの場合、2010年以降7では不十分であり、Linus Torvalds自身がdce9648をコミットします(git 1.7.4.4、2010年10月):
デフォルトの7は、Git開発のかなり早い段階であり、7桁の16進数が多かった(約2億5000万以上のハッシュ値に対応)。
当時、65,000のリビジョンはたくさんあり(BKでヒットしようとしていた)、各リビジョンは約5〜10の新しいオブジェクトになる傾向があるため、100万のオブジェクトが大きな数でした。
(BK = BitKeeper)
最近では、カーネルは最大のgitプロジェクトでもなく、カーネルにも約220kのリビジョン(BKツリーよりもはるかに大きい)があり、200万のオブジェクトに近づいています。
その時点で、7桁の16進数、まだそれらの多くのためにユニークですが、私たちは、オブジェクトの数とハッシュサイズとの大きさの差の程度ちょうど2つの注文を話しているとき、そこになります切り捨てられ、ハッシュ値の衝突なります。
それはもはや非現実的なものに近づくことさえありません-それはいつも起こります。
我々は両方の非現実小さかったデフォルトの略語を増加させ、必要があると人々はGitの設定ファイルにプロジェクトごとの自分のデフォルトを設定するための方法を追加します。
core.abbrev
オブジェクト名が省略される長さを設定します。
指定されていない場合、多くのコマンドは7桁の16進数に短縮されます。これは、短縮されたオブジェクト名が十分に長い間一意であるには不十分な場合があります。
environment.c
:
int minimum_abbrev = 4, default_abbrev = 7;
注:としては、以下のコメントでmarco.m、core.abbrevLength
に改名されたcore.abbrev
のそれと同じGitの1.7.4.4にコミットa71f09f
名前をcore.abbrevlength
元に戻すcore.abbrev
--abbrev=$n
結局のところ、コマンドラインオプションに対応しています。
最近、Linusがコミットe6c587cに追加しました(Git 2.11、2016年第4四半期用):(Matthieu Moyの回答で
述べたように)
かなり初期の段階で、オブジェクト名を7桁の16進数に短縮することにしましたが、プロジェクトが成長するにつれて、以前に作成されてログメッセージに記録されたこのような短いオブジェクト名が一意ではなくなる可能性が高まっています。
現在、Linuxカーネルプロジェクトでは11桁から12桁の16進数が必要ですが、Git自体ではオブジェクトを一意に識別するために10桁の16桁が必要ですが、小さなプロジェクトの多くは、元の7桁のデフォルトで問題ない場合があります。ワンサイズはすべてのプロジェクトに適合しません。
メカニズムを導入します。最初のリクエストでリポジトリ内のオブジェクト数を見積もり、デフォルト設定でオブジェクト名を省略して、リポジトリの適切なデフォルトを作成します。2^(2N)
最初のNビットに短縮されたオブジェクト名を使用すると、リポジトリとオブジェクトの衝突が発生するという予想に基づいて、リポジトリ内のオブジェクトの数をカバーするのに十分な数の16進数を使用します。
短縮名に追加する16進数(4ビット)ごとに、リポジトリ内に4倍(2ビット)のオブジェクトを含めることができます。
Linus Torvalds()によるcommit e6c587c(01 Oct 2016)を参照してください。Junio C Hamano()によるcommit 7b5b772、commit 65acfea(2016年10月1日)を
参照してください。(による合併Junio C浜野- -でbb188d0コミット、2016年10月3日)をtorvalds
gitster
gitster
その新しいプロパティ(SHA1の省略値の妥当なデフォルトを推測する)は、Gitがreleaseの独自のバージョン番号を計算する方法に直接影響します。