Интернет абсолютно завален неправильными и неидеальными ответами на этот вопрос. Это печально, потому что вы думаете, что это будет обычная вещь, которую вы хотели бы сделать.
Проблема: при запуске hook pre-commit
репозиторий может быть не чистым. Поэтому, если вы наивно выполняете свои тесты, они не будут против того, что вы совершаете, но какая бы грязь ни была в вашем рабочем дереве.
Очевидное, что нужно сделать, это git stash --keep-index --include-untracked
в начале pre-commit
и git pop
на выходе. Таким образом, вы тестируете индекс (чистый), который мы хотим.
К сожалению, это создает маркеры конфликтов слияния, если вы используете git add --patch
(особенно если вы редактируете ханки), так как содержимое [email protected]{0}
может не совпадать с деревом работы после фиксации.
Другим распространенным решением является клонирование репозитория и запуск тестов в новом временном. Есть две проблемы: одна заключается в том, что мы еще не сделали этого, поэтому мы не можем легко получить копию репозитория в состоянии, которое мы собираемся совершить (я уверен, что есть способ сделать это, но меня это не интересует, потому что:). Во-вторых, мои тесты могут быть чувствительны к местоположению текущего рабочего каталога. Например, из-за конфигурации локальной среды.
Итак: как я могу восстановить свое рабочее дерево в любом состоянии, которое было до git stash --keep-index --include-untracked
, без введения маркеров конфликтов слияния и без изменения пост-фиксации HEAD
?