2012-11-13 13 views
5

Chcę uzyskać zmiany pomiędzy dwoma podanymi tagów, komenda brzmi:Dlaczego dziennik git --cherry-pick działa tak wolno?

git log `Tag1...Tag2 --cherry-pick --no-merges --right-only 

ale jest bardzo powolny.

Testuję parametry odpowiednio jeden po drugim. TYLKO gdy z --cherry-pick, dziennik git jest bardzo wolny.

Dlaczego? Czy ktoś mógłby mi pomóc?

Odpowiedz

1

--cherry-pick
pomijają żadnych popełnić która wprowadza taką samą zmianę jako kolejny popełnić na „drugiej stronie”, gdy zestaw zobowiązuje między innymi z różnicy symetrycznej.

Na przykład, jeśli masz dwa odgałęzienia, A i B, zwykłym sposobem wyświetlania wszystkich zatwierdzeń tylko po jednej stronie jest -left-right (patrz przykład poniżej w opisie). opcja prawo-lewo). Pokazuje jednak, że zatwierdzenia, które zostały wyselekcjonowane z innego oddziału (na przykład "3rd on b" może być wyselekcjonowany z gałęzi A). Dzięki tej opcji takie pary zatwierdzeń są wykluczane z wyjścia.

Należy porównać wszystkie zatwierdzenia w poszukiwaniu podobieństw - będzie to bardzo powolna operacja w porównaniu do braku konieczności jakiegokolwiek porównania.

+0

Dzięki za odpowiedź, że ma rację. Widzę tę stronę man. jednak, jak powiedział, planujemy pominąć zmiany, które pojawiają się w innym oddziale. Czy zamiast tego mamy inne sposoby? –

+0

Jeśli używasz scalania zamiast wybierania wiśniowego, możesz to zrobić bez całego narzutu. – Michael

+0

Tak, wiem, ale podstawa kodu problemu nie jest naszą pracą, po prostu pobieramy zmiany, aby przeanalizować jakość jakiegoś składnika. nie możemy kontrolować zachowań programistów. –

0

Używam

git log tag1 --not tag2 

co daje mi wszystkie rewizje na Tag1 nie na tag2. działa również dla gałęzi i znaczników.

-1

Zbiór wiśni może nie być tak szybki, ponieważ prawdopodobnie wykrywa nazwy jako część scalenia, które mogą być kosztowne, szczególnie gdy wybierasz coś, co jest daleko od HEAD.

może się okazać, że twój git config ma gc.auto = 0 (git config --get gc.auto), więc dokładnie sprawdzić, czy jest włączone, lub po prostu uruchomić:

git gc 

w celu porządkowych niepotrzebnych plików i optymalizacji lokalnego repozytorium.

Możesz także spróbować ustawić zmienną konfiguracyjną merge.renamelimit na coś mniejszego (np. 1, ponieważ 0 oznacza bez limitu). Jeśli to nie pomoże, spróbuj profilować swój git (np. Używając strace lub perf record git cherry-pick ...) i znajdź wąskie gardło.

Patrz: cherry-pick is slow

Dla scalenia-rekurencyjnej, że zawsze chcemy obliczyć parami zmienia nazwę od każdej strony i przodka. Tak więc różnica do docelowego zbioru wiórów zawsze będzie kosztowną operacją O (liczba operacji zmian między źródłem a dest).

Bez zmiany nazwy można lepiej wykorzystać faktyczne scalenie z chodzeniem w trójwymiarze drzewa . Np. Widzisz, że niektóre pod-drzewa znajdują się w drzewie A w drzewach ours i ancestor, ale w drzewie B w theirs.Więc nie musisz więcej schodzić i możesz po prostu powiedzieć "weź ich" (cóż, masz zejście na theirs, aby uzyskać wartości). Ale spodziewam się, że komplikuje to więcej interakcji z indeksem (i prawdopodobnie nie jest to warte poświęcenia z powodu problemu zmiany nazwy).

-Peff

Powiązane problemy