2016-04-08 7 views
7

Podczas korzystania z git bisect, można uruchomić git bisect skip, aby oznaczyć bieżące zatwierdzenie jako nieodtwarzalne/niesprawdzalne, aby spróbować przekonać Gita do wybrania innego zatwierdzenia do przetestowania.W jaki sposób git bisect pomija wybór następnego commitowania?

W jaki sposób Git decyduje, które zatwierdzenie wypróbować po git bisect skip? Eksperymentowanie pokazuje, że nie jest to tylko sąsiednie zatwierdzenie, ale nie mogę opracować wzorca.

Edit: Jestem świadomy podstawowe git bisect jest wyszukiwanie binarne, ale jestem ciekaw git bisect skip, która jest wyraźnie robi coś bardziej skomplikowanego.

Eksperymentacja pokazuje, że nie jest to tylko wybór sąsiedniego zatwierdzenia; poniżej tworzy 100 zatwierdzeń o numerach 0 – 99, a następnie rozpoczyna ich dzielenie na dwie części. Pierwsze zatwierdzenia znajdują się w środku, ale każdy z nich wydaje się być mniej lub bardziej losowo wybrany.

$ 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

Czy przeczytałeś dokumentację? Mówię, że używa wyszukiwania binarnego. https://git-scm.com/docs/git-bisect – crashmstr

+2

@crashmstr Czy? Nie jest to zbyt jasne na podstawie komendy * pominięcie *. –

+2

@crashmstr: Wiem, że podstawowe użycie 'git bisect' jest wyszukiwaniem binarnym. Ale 'git bisect skip' nie może być po prostu binarnym wyszukiwaniem, ponieważ nie jest to binarne wyszukiwanie _does_. I tak, przejrzałem dokumentację, a nawet zacząłem próbować spojrzeć na kod źródłowy przed pytaniem tutaj, i nie mogę znaleźć nigdzie, co wyjaśnia, w jaki sposób wybiera się następny commit po "pomijaniu git bisect". –

Odpowiedz

9

zrobiłem kilka kopanie w kodzie źródłowym Git i znaleźć większość odpowiedzi sobie ...

Od Git v1.6.4 (konkretnie, od commit ebc9529f), Git używa "PRNG (generator liczb pseudolosowych) z uprzedzeniem", aby określić, które zatwierdzenie spróbuje dalej po pominięciu.

Nie mogę powiedzieć, śledzę samego algorytmu (co wydaje się być zasadniczo nietknięte, ponieważ został dodany jako pierwszy z v2.8.1), ale wiadomość popełnić robi rozsądny robotę wyjaśniając, co się dzieje:

przepoławiać: użyć PRNG z błędu podczas przeskakiwania od nietestowalna dopuszcza

Stosując PRNG (pseudo generator liczb losowych) z odchylenia powinny być lepsze niż naprzemiennie 3 ustalonych proporcjach.

W repozytoriach z wieloma niepotwierdzonymi zatwierdzeniami powinno zapobiegać naprzemiennemu określeniu między obszarami, w których wiele zatwierdzeń jest niesprawdzonych. Przeciążenie powinno faworyzować zatwierdzeń, które mogą dostarczyć więcej informacji, tak, że proces bisekcji nie powinien stracić dużej wydajności.

Firma HPA zaproponowała użycie PRNG i stwierdziła, że ​​najlepszym rozwiązaniem jest podniesienie współczynnika między 0 a 1, podanego przez PRNG do mocy 1,5.

Tak to wygląda tak, jakby Git odbiera kolejny popełnić, aby spróbować w sposób losowy, ale rozkład losowy został wybrany do (miejmy nadzieję) wybrać zobowiązuje które dają więcej informacji o wyszukiwaniu binarnym i uniknąć zobowiązuje mogących być w regionach niepoprawnych zatwierdzeń.

-4

Jak sama nazwa sugerowałaby Git, krótka odpowiedź brzmi: To dla twojego businness.

Ideą git bisect jest to, że można określić dwa punkty końcowe i Git figura to commit, w międzyczasie, że uzna jest przydatna jeden za cel zmniejszenie liczby testów.

Jako dokumentacja mówi, że to jest po prostu wyszukiwania binarnego, ale nie precyzuje, jakiego rodzaju algorytm jest używany

Następnie git commit przepoławiać wybiera między tymi dwoma punktami końcowymi

Może ona nie jest prostym wyszukiwaniem binarnym, Git może wykorzystywać dowolny algorytm decyzyjny, który chce, i wyraźnie nie chce, abyś go znał, abyś nie przyjmował założeń dotyczących zatwierdzenia, które zostanie wybrane w górę.

Jeśli chodzi o zmieniając podniósł popełnić to daje dwie możliwości:

  1. ręcznie wybrać nowy popełnić. Na przykład z git reset --hard.
  2. Mówisz Gitowi, aby dokonał nowego wyboru, z git bisect skip.

W tym ostatnim przypadku, jak podczas aktualizacji punktów końcowych z good i bad, decyzja podejmowana jest przez Git, sposób, w jaki chce.


Z ciekawości zrobiłem prosty repozytorium pojedynczej gałęzi i próbował dowodzić git bisect skip.
Moja wersja Git podniosła poprzednie zatwierdzenie.

+7

Z pewnością nie jest to coś, o czym muszę wiedzieć, aby użyć tego narzędzia, ale nie zgadzam się, że sposób, w jaki działa projekt open source, to "nie moja sprawa"; gdyby tak było, nie byłby to open source. Próbowałem zaspokoić moją ciekawość tutaj, w nadziei, że ktoś po prostu pozna odpowiedź, zamiast zmuszać mnie do wkopania się w kod źródłowy. –

Powiązane problemy