У меня есть центральное git-репо, настроенное с использованием gitolite.
Я хочу настроить хук так, чтобы всякий раз, когда пользователь подталкивал к репо, он выполнял извлечение в другом месте, а затем некоторые автоматическое тестирование.
Пока я только хочу, чтобы он выполнял извлечение.
В каталоге hooks я создал следующие имена сценариев после обновления:
#!/bin/sh
cd /home/git/www/epicac
git pull
Когда я вызываю этот сценарий с помощью ./post-update, он делает именно то, что я хочу.
Однако всякий раз, когда он вызывается автоматически при подключении, я получаю: fatal: Не репозиторий git: '.'
Есть идеи, почему это может происходить?
У вас есть возможность провести различные диагностики, как предложено в этом ответе SO.
В частности, проверьте значение GIT_DIR
и GIT_WORK_TREE
.
Пока работает хук,
GIT_DIR
и (если рабочее дерево не может быть выведено изGIT_DIR
)GIT_WORK_TREE
установлены.
Это означает, что ваш pull не будет работать с репозиторием в каталоге, который вы изменили.
См. также запись в блоге Using Git Inside a Git Hook:
В конце концов мы пригласили нашего linux-гуру, и он заметил, что окружение, в котором работает пользователь git, совершенно иное, когда он находится внутри хука.
Gitolite делает кучу вещей с окружением, но единственное, что нас подводило, это установкаGIT_DIR
.
После того, как мы разобрались с этим, решение оказалось простым:
ENV.delete 'GIT_DIR'
в нашем скрипте на руби, который запускается хуком '
post-receive
'.
То же самое в . Git Tip: Auto update working tree via post-receive hook, но с элегантным выходом из положения:
Решение?
Оказывается, хукpost-receive
запускается с переменной окруженияGIT_DIR
, установленной вrepo/. git
, поэтому независимо от того, по какому пути вы 'cd', он всегда будет пытаться запустить все следующие команды git там.
Исправить это можно просто снятием установкиGIT_DIR
(спасибо Ульриху Петри за элегантноеenv -i
решение):
#!/bin/sh
cd ..
env -i git reset --hard
Ничего ... нашел здесь: https://serverfault.com/questions/107608/git-post-receive-hook-with-git-pull-failed-to-find-a-valid -git-directory