2010-08-22 5 views
16

У меня есть центральный git repo, созданный с использованием гитолита.Вызов «git pull» из git post-update hook

Я хочу настроить крючок таким образом, чтобы всякий раз, когда пользователь нажимает на репо, он выполняет попытку в другом месте, а затем некоторое автоматическое тестирование.

До сих пор я только хочу, чтобы он выполнял тягу.

В каталоге крючками я создал следующие имена сценариев пост-обновления:

#!/bin/sh 
cd /home/git/www/epicac 
git pull 

Когда я вызвать этот сценарий с помощью ./post-update, это именно то, что я хочу.

Однако, когда он вызывается автоматически, когда я подключаюсь, я получаю: фатальный: не репозиторий git: '.'

Любая идея, почему это может произойти?

+2

Просто добавили 'ENV -i GIT pull' решение. – VonC

+0

имеют точно такую ​​же проблему, даже после 7 лет –

ответ

25

У вас есть различные диагностики для запуска, как предложено в этом SO answer.

В частности, check out the the value of GIT_DIR and GIT_WORK_TREE.

Пока крючок работает, GIT_DIR и (если worktree не может быть выведено из GIT_DIR) GIT_WORK_TREE установлены.
Это означает, что ваше притяжение не будет работать с репозиторием в каталоге, в который вы изменили.


Смотрите также блог пост Using Git Inside a Git Hook:

В конце концов мы получили Линукс гуру снова и он заметил, что среда, под которой запускается пользователь мерзавец совершенно иначе, когда внутри крючка.
Gitolite делает кучу вещей в env, но тот, который нас закручивал, был настройкой 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 
7

Как об указании --git-dir.

#!/bin/sh 
cd /home/git/www/epicac 
git --git-dir=.git pull 
0

Это должно сделать трюк только в одной строке:

git -C /home/git/www/epicac pull