Вызов 'git pull' из ловушки git после обновления - PullRequest
17 голосов
/ 22 августа 2010

У меня есть центральное git-репо, настроенное с использованием gitolite.

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

Пока что я только хочу, чтобы он выполнил тягу.

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

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

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

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

Есть идеи, почему это может происходить?

Ответы [ 4 ]

27 голосов
/ 22 августа 2010

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

В частности, проверить значение GIT_DIR и GIT_WORK_TREE.

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


См. Также сообщение в блоге Использование Git внутри Git Hook :

В конце концов мы покончили с нашим гуру Linux, и он заметил, что среда, в которой работает пользователь git, совершенно другая, когда он находится внутри хука.
Gitolite делает с вещами кучу вещей, но то, что нас облажало, это настройка GIT_DIR.
После того, как мы поняли это, решение было так просто, как:

ENV.delete 'GIT_DIR'

в нашем скрипте ruby, который вызывается хуком 'post-receive'.


То же самое предложение в Совет по Git: автоматическое обновление рабочего дерева с помощью перехвата после получения , но с элегантным выходом из этого:

Решение?
Оказывается, перехват post-receive начинается с переменной окружения GIT_DIR, установленной в папку repo/.git, поэтому независимо от того, по какому пути вы в нее входите, cd всегда будет пытаться выполнить любые следующие команды git .
Исправление это просто вопрос сброса GIT_DIR
(спасибо Ульриху Петри за элегантное решение env -i ):

#!/bin/sh
cd ..
env -i git reset --hard
7 голосов
/ 15 февраля 2012

Как насчет указания --git-dir.

#!/bin/sh
cd /home/git/www/epicac
git --git-dir=.git pull
1 голос
/ 22 августа 2010
0 голосов
/ 02 февраля 2016

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

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