2016-04-08 4 views
7

Bei der Verwendung von git bisect kann git bisect skip ausgeführt werden, um das aktuelle Commit als unbuildbar/nicht testbar zu kennzeichnen, um zu versuchen, Git dazu zu bringen, ein anderes Commit zum Testen auszuwählen.Wie wählt git bisect überspringen den nächsten Commit aus?

Wie entscheidet Git, welche sich nach einem git bisect skip versuchen? Das Experimentieren zeigt, dass es nicht nur ein angrenzendes Commit ist, aber ich kann das Muster nicht ausarbeiten.

bearbeiten: Ich bin der Grund git bisect bewusst eine binäre Suche, aber ich bin neugierig auf git bisect skip, die eindeutig etwas komplizierter zu tun ist.

Experimentieren zeigt, dass es nicht nur ein angrenzendes Commit wählt; die unten erstellt 100 commits nummeriert 0 – 99 dann beginnt, sie zu teilen. Der erste Commit git bisect liegt in der Mitte, aber jeder git bisect skip scheint danach mehr oder weniger zufällig ausgewählt zu sein.

$ 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 
+0

Haben Sie die Dokumentation gelesen? Ich sage, dass es eine binäre Suche verwendet. https://git-scm.com/docs/git-bisect – crashmstr

+2

@crashmstr Hast du? Es ist nicht sehr klar auf den Unterbefehl * skip * in der Tat. –

+2

@crashmstr: Ich weiß, dass die grundlegende Verwendung von 'git bisect' eine binäre Suche ist. Aber "git bisect skip" kann nicht nur eine binäre Suche sein, weil das nicht eine binäre Suche ist _does_. Und ja, ich habe die Dokumentation durchforstet und habe sogar angefangen, den Quellcode zu betrachten, bevor ich hier nachfragte, und ich kann nirgends finden, dass es erklärt, wie der nächste Commit nach einem 'git bisect skip' gewählt wird. –

Antwort

9

Ich habe einige in den Quellcode Git Graben und mir die meisten eine Antwort gefunden ...

Ab v1.6 Git.In 4 (genauer gesagt in commit ebc9529f) verwendet Git "einen PRNG (Pseudozufallszahlengenerator) mit einem Bias", um zu bestimmen, welches Commit als nächstes zu versuchen ist, nachdem eines übersprungen wurde.

ich nicht sagen kann ich den Algorithmus selbst folgen (die grundsätzlich unberührt zu sein scheint, da es zuerst ab v2.8.1 hinzugefügt wurde), aber die Nachricht Commit macht einen vernünftigen Job zu erklären, was los ist:

bisect: einen PRNG mit einer Vorspannung verwendet werden, wenn sie von untestable begeht

einen PRNG Verwendung Überspringen entfernt (Pseudozufallszahlengenerator) mit einer Vorspannung soll als Wechsel zwischen 3 festen Verhältnissen besser sein.

In Repositories mit vielen nicht testbaren Commits sollte verhindert werden, dass Bereiche, in denen viele Commits nicht testbar sind, abwechselnd werden. Die Verzerrung sollte begünstigen, die mehr Informationen geben kann, so dass der Halbierungsprozess nicht viel Effizienz verlieren sollte.

HPA schlug vor, einen PRNG zu verwenden, und stellte fest, dass die beste Vorspannung ein Verhältnis zwischen 0 und 1 ist, das von der PRNG an die Leistung 1,5 gegeben wird.

So sieht es aus, als ob Git der nächsten Commit versuchen zufällig wählt, aber die zufällige Verteilung wurde gepflückt (hoffentlich) Commits wählen, die mehr Informationen für die binäre Suche geben und Festschreibungen zu vermeiden, wahrscheinlich in Regionen sein von untestabilen Commits.

-4

Wie der Name Git würde vorschlagen, die kurze Antwort ist: Es ist nicht von Ihrem businness.

Die Idee hinter git bisect ist, dass Sie zwei Endpunkte angeben und Git kapier eine begehen, zwischendurch, dass es denkt ist nützlich ein für das Ziel, die Anzahl des Tests reduzieren.

Da die Dokumentation sagt dies nur eine binäre Suche ist, aber nicht angibt, welche Art von Algorithmus

verwendet wird

Dann git bisect nimmt ein

zwischen diesen beiden Endpunkten begehen

Es kann Seien Sie nicht einfach binäre Suche, Git kann jeden Entscheidungsalgorithmus verwenden, den es will, und es explizit nicht will, dass Sie es wissen, so dass Sie Annahmen über das Festschreiben nicht machen werden, das ausgewählt wird oben.

Wenn es um die Änderung der oben zu begehen gepflückt kommt es Ihnen zwei Möglichkeiten gibt:

  1. Sie auch manuell die neue begehen. Zum Beispiel mit git reset --hard.
  2. Sie sagen Git, um eine neue Wahl zu treffen, mit git bisect skip.

Im letzteren Fall, wie wenn Sie die Endpunkte mit good und bad aktualisieren, wird die Entscheidung von Git, die Art und Weise macht es will.


Aus Neugier habe ich Single-Zweig-Repository einfach und versuchte, den git bisect skip Befehl.
Meine Version von Git nahm das vorherige Commit auf.

+7

Es ist sicherlich nicht etwas, was ich wissen muss, um das Tool zu verwenden, aber ich stimme nicht zu, dass ein Open-Source-Projekt "nichts von meinem Geschäft" ist; Wenn das der Fall wäre, wäre das nicht Open Source. Ich versuchte, meine Neugier hier zu sättigen, in der Hoffnung, dass jemand die Antwort nur wissen würde, anstatt dass ich brauchte, um in den Quellcode selbst zu gehen. –