31

を使用する場合git bisect、実行git bisect skipして現在のコミットをビルド不可/テスト不可としてマークし、代わりにテストする別のコミットを Git に選択させることができます。

Git は の後にどのコミットを試みるかをどのように決定しgit bisect skipますか? 実験は、それが隣接するコミットではないことを示していますが、パターンを理解することはできません.

編集:基本は二分探索であることは承知していますが、明らかにもっと複雑なことをしていることにgit bisect興味があります。git bisect skip

実験は、隣接するコミットを選択するだけではないことを示しています。以下は、0 ~ 99 の番号が付けられた 100 個のコミットを作成し、それらの分割を開始します。最初のコミットのgit bisect選択は途中ですが、git bisect skipその後は多かれ少なかれランダムに選択されているようです。

$ git init
Initialized empty Git repository in .git/

$ for (( i=0; i<100; i++ )); do echo $i > file; git add file; git commit -m $i >/dev/null; done  # Create some dummy commits

$ git bisect start HEAD $(git rev-list --max-parents=0 HEAD)  # HEAD is bad, root commit is good.
Bisecting: 49 revisions left to test after this (roughly 6 steps)
[099e5cf2ccde625f92dc369da6cad0bdf2852ce4] 49

$ git bisect skip
Bisecting: 49 revisions left to test after this (roughly 6 steps)
[88c8208a7c4322222124167e49f07c741af7d3d8] 60

$ git bisect skip
Bisecting: 49 revisions left to test after this (roughly 6 steps)
[04695f2e5b2473c3ac72435c0dbfc3ba1375abda] 88

$ git bisect skip
Bisecting: 49 revisions left to test after this (roughly 6 steps)
[1e9bf3d29589bcac2d8c467245ae8d446c195252] 40

$ git bisect skip
Bisecting: 49 revisions left to test after this (roughly 6 steps)
[9459ed79e4112d674681c8f0f921127217c7ebc6] 13
4

2 に答える 2

39

私はGitのソースコードを掘り下げて、ほとんどの答えを自分で見つけました...

Git v1.6.4 (具体的には、コミット ebc9529fの時点) では、Git は「バイアス付きの PRNG (疑似乱数ジェネレーター)」を使用して、1 つスキップした後に次に試行するコミットを決定します。

アルゴリズム自体に従っているとは言えません (v2.8.1 の時点では、最初に追加されて以来、基本的に変更されていないようです)。

bisect: テスト不可能なコミットをスキップするときは、偏りのある PRNG を使用します

PRNG (疑似乱数発生器) をバイアス付きで使用することは、3 つの固定比率を交互に使用するよりも優れているはずです。

多くのテストできないコミットがあるリポジトリでは、多くのコミットがテストできない領域を交互に切り替えることを防ぐ必要があります。バイアスは、より多くの情報を提供できるコミットを優先する必要があるため、二分プロセスの効率が大幅に低下することはありません。

HPA は PRNG の使用を提案し、最良のバイアスは PRNG によって与えられる 0 と 1 の間の比率を 1.5 乗することであることがわかりました。

そのため、Git は次のコミットをランダムに選択して試行するように見えますが、ランダムな分布が選択されたのは (うまくいけば) バイナリ検索のためのより多くの情報を提供するコミットを選択し、コミットがテスト不可能な領域にある可能性が高いコミットを回避するためです。

于 2016-04-10T00:33:03.300 に答える