Internet jest całkowicie zaśmiecony niepoprawnymi i nieidealnymi odpowiedziami na to pytanie. Jest to niefortunne, ponieważ można by pomyśleć, że to zwykła rzecz, którą chciałbyś zrobić.Testowanie tego, co ma się stać w haku przed popełnieniem przestępstwa
Problem: Po uruchomieniu haka pre-commit
repozytorium może nie być czyste. Więc jeśli naiwnie przeprowadzisz swoje testy, nie będą one przeciwko temu, co popełniasz, ale jakikolwiek brud jest w twoim drzewie pracy.
Oczywistym rozwiązaniem jest git stash --keep-index --include-untracked
na początku pre-commit
i git pop
przy wyjściu. W ten sposób testujesz przeciwko (czystemu) indeksowi, który jest tym, czego chcemy.
Niestety, generuje to znaczniki konfliktów scalających, jeśli używasz git add --patch
(szczególnie jeśli edytujesz porcje), ponieważ zawartość [email protected]{0}
może nie być zgodna z drzewem roboczym po zatwierdzeniu.
Innym powszechnym rozwiązaniem jest sklonowanie repozytorium i przeprowadzenie testów w nowym tymczasowym. Są na to dwa problemy: Po pierwsze, nie mamy jeszcze zobowiązania, więc nie możemy łatwo uzyskać kopii repozytorium w stanie, w którym mamy zamiar dokonać (jestem pewien, że jest sposób na zrobienie tego , ale nie jestem zainteresowany, ponieważ :). Po drugie, moje testy mogą być wrażliwe na lokalizację bieżącego katalogu roboczego. Na przykład ze względu na konfigurację lokalnego środowiska.
A więc: Jak mogę przywrócić moje drzewo robocze do stanu, w jakim było przed git stash --keep-index --include-untracked
, bez wprowadzania znaczników konfliktu korespondencji seryjnej i bez modyfikowania po zatwierdzeniu HEAD
?
skrypt pre-commit odbiera dane popełniane jako wejście. Dlaczego musisz patrzeć na cokolwiek innego? Być może to, co próbujesz zrobić, najlepiej zrobić w czymś innym niż haczyk przed popełnieniem błędu. Jakie testy chcesz wykonać, które wymagają dostępu do pełnego repozytorium? –
@WilliamPursell: Co rozumiesz przez "dane, które zostały popełnione?". Skrypt przed zatwierdzeniem działa w moim drzewie roboczym (to jest w bazie źródłowego repozytorium). Problem polega na tym, że jeśli wprowadzisz jakieś zmiany do repozytorium i tylko wykonasz kilka z nich (np. Dodasz niektóre pliki, ale nie inne), to nie przetestujesz zatwierdzenia, zanim się to stanie (co chcę zrobić), będziesz testować wszystko, co masz w swoim katalogu roboczym. – pwaller
Łatka, którą popełniasz, jest dostępna na stdin do haka przed zatwierdzeniem. Co testujesz, jeśli nie łatka, która jest zatwierdzana? Celem haka przed zatwierdzeniem jest weryfikacja poprawki. –