Я не могу воспроизвести вашу проблему.Первоначально я предполагал, что переменная окружения GIT_INDEX_FILE
была отменена вашей pre-commit
ловушкой.Однако, когда я попытался сбросить GIT_INDEX_FILE
с pre-commit
, у меня возникла другая проблема (Git пожаловался, что .git/index
заблокирован).
Вот пример сценария, который показывает, что Git функционирует так, как вы ожидаете, и что-тоостальное должно быть не так.Этот скрипт инициализирует новый тестовый репозиторий, создает хук pre-commit
, который имитирует то, что делает ваш хук, и делает несколько тестовых коммитов:
#!/bin/sh
# initialize the test repository
rm -rf testrepo
git init testrepo
cd testrepo
# create the pre-commit hook
cat <<\EOF >.git/hooks/pre-commit
#!/bin/sh
git status --porcelain | while IFS= read -r line; do
# todo: handle renames and deletions of a *.less file
f=${line#???}
case ${f} in
*.less)
fb=${f%.less}
echo bar >>"${fb}".css
echo baz >>"${fb}".min.css
git add "${fb}".css "${fb}".min.css
;;
esac
done
EOF
chmod +x .git/hooks/pre-commit
# create foo.less, commit it
echo foo >foo.less
git add foo.less
git commit -m "add foo.less"
# modify foo.less, commit it
echo foo2 >>foo.less
git commit -a -m "modify foo.less"
Если вы запустите git log -p
в тестовом репозитории и посмотрите наВ результате коммитов вы увидите, что foo.css
и foo.min.css
изменялись при каждом изменении foo.less
.
Вот почему я подумал, что ваша проблема была вызвана изменением / отменой установки переменной среды GIT_INDEX_FILE
:
Когда запускается git commit -a
, Git создает временный индексный файл и использует его вместо значения по умолчанию .git/index
для создания фиксации.Чтобы операции типа git add
работали из ловушки pre-commit
, Git устанавливает переменную окружения GIT_INDEX_FILE
в качестве имени временного индекса, созданного до запуска pre-commit
.Если ваш хук сбрасывает GIT_INDEX_FILE
или устанавливает его на .git/index
, то все операции Git из вашего хука будут пытаться изменить исходный индекс, а не временный индекс, который используется для генерации фиксации.
Однако временный индексный файл также действует как блокировка исходного индексного файла.Если ловушка пытается изменить исходный индекс, а временный индекс существует, Git прервет работу с ошибкой.