Подтвердить что ты не робот

Git checkout в post-receive hook: "Не репозиторий Git". "

У меня есть не-голый репозиторий на моем сервере (dirs/home/andrew/web и /home/andrew/web/.git), установите метод receive.denyCurrentBranch, чтобы игнорировать и создать post-receive hook:

#!/bin/sh
GIT_WORK_TREE=/home/andrew/web git checkout -f

Когда я запускаю sh.git/hooks/post-receive, все работает нормально. Но когда я выхожу из своего ПК, я получаю эту ошибку:

remote: fatal: Not a git repository: '.'

Есть ли способ решить эту проблему? И, в конце концов, без необходимости переключаться на голый репо?

Спасибо

EDIT: Здесь мой новый пост-приемный крючок. Почему это так описано в принятом ответе.

echo "\nChecking out $PWD"
GIT_DIR=/home/andrew/web/.git
GIT_WORK_TREE=/home/andrew/web git checkout -f
4b9b3361

Ответ 1

[Edit, Feb 2017: этот старый ответ по-прежнему попадает немного, поэтому добавьте несколько заметок. (1) Такое живое обновление часто представляет собой плохую идею: убедитесь, что знаете, почему вы это делаете, и что вы не будете скрывать свою работу. (2) В Git начиная с версии 2.3 вы можете настроить receive.denyCurrentBranch на updateInstead, а также настроить трюк в Git 2.4 и более поздних версиях. Подробнее см. документация git config.]

Захват после приема запускается с $GIT_DIR, установленным на .. Это заставляет Git искать ./HEAD, ./refs/heads/master и т.д., А не .git/HEAD, .git/refs/heads/master и т.д. Но, поскольку вы не делаете ничего, чтобы изменить $PWD на крючок (как все равно), хук будет запущен в подкаталоге .git (/home/andrew/web/.git), и, следовательно, этот сбой довольно таинственный: . фактически будет допустимым репозиторием Git.

Один стандартный трюк, который позволяет избежать жесткого кодирования имени пути, заключается в использовании cd ..; git checkout -f в качестве крюка после приема. В этом случае проблема с установкой $GIT_DIR становится проблемой, потому что после cd .. выполняется перехват (все еще предполагается этот случай) /home/andrew/web и, конечно же, в этой точке $GIT_DIR должен быть .git, а не .. Стандартное исправление для этого - просто отключить GIT_DIR (установка его на .git также будет работать).

Ваш пост-приемный крюк, как показано, отлично работает для меня, хотя (с соответствующими изменениями с жестким кодированием). Затем снова я выхожу из Unix-подобной машины, а не из ПК. Возможно ли, что что-то еще происходит, что изменяет каталоги из подкаталога .git? Вы можете сделать что-то вроде echo running in $PWD на крючке, чтобы увидеть, где вы находитесь.