Ответ 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
на крючке, чтобы увидеть, где вы находитесь.