Почему настройка GIT_WORK_TREE не работает в ловушке после фиксации? - PullRequest
7 голосов
/ 04 октября 2011

Я пытаюсь использовать следующую ловушку post-commit для развертывания в определенном каталоге после каждой успешной фиксации:

#!/bin/sh
export GIT_WORK_TREE=/var/www/example/
export GIT_DIR=/home/mark/test/.git/
git checkout -f

Однако после фиксации я получаю следующую ошибку:

$ git commit -m 'An example commit.'
fatal: Unable to create '/var/www/example/.git/index.lock': No such file or directory
[master 0938e48] An example commit.

... как будто настройка GIT_WORK_TREE игнорируется.Почему установка этой переменной среды не работает?Я использую GIT версии 1.7.4.1.

1 Ответ

18 голосов
/ 04 октября 2011

Проблема здесь в том, что в post-commit хуках (а также pre-commit, prepare-commit-msg и commit-msgt) переменная окружения GIT_INDEX_FILE установлена ​​в .git/index.(Это не задокументировано в документации githooks , но я опубликовал в другом месте о настройках переменных среды и текущем каталоге в перехватчиках git .)

Влияние переменной среды GIT_INDEX_FILE описано в разделе «ПЕРЕМЕННЫЕ ОКРУЖАЮЩЕЙ СРЕДЫ» справочной страницы git как:

GIT_INDEX_FILE

Эта среда [переменная] позволяет указать альтернативный индексный файл.Если не указано, используется значение по умолчанию $GIT_DIR/index.

... и по какой-то причине в этой ситуации GIT_INDEX_FILE используется относительно GIT_WORK_TREE.

Чтобы крючок работал так, как вы ожидаете, вам нужно просто сбросить GIT_INDEX_FILE, чтобы ваш крючок выглядел так:

 #!/bin/sh
 unset GIT_INDEX_FILE
 export GIT_WORK_TREE=/var/www/example/
 export GIT_DIR=/home/mark/test/.git/
 git checkout -f
...