Хук пост-получения Git не работает

Мы используем git с центральным репо (используя Gitosis). Я создал хук после получения, чтобы генерировать электронное письмо в список рассылки разработчиков всякий раз, когда изменения отправляются в центральное репо, и для создания документации из папки документации в репозитории git.

Поэтому в ~git/ у меня есть каталог, назовем его «a», который содержит клон репозитория git. Хук post-receive выглядит так:

#!/bin/bash
cd ~git/repositories/a.git
. ~git/post-receive-email &> /dev/null
( cd ~git/a && git pull &> ~git/pull_log.log && php ~git/a/scripts/generate_markdown_documentation.php &> ~git/doc_log.log )

Сценарий электронной почты работает, но генерация документации не работает. Содержимое pull_log.log:

fatal: Not a git repository: '.'

Это заставляет меня думать, что он не переходит в правильный каталог в строке 5 приведенного выше сценария. Я ошибся? Как я могу заставить это работать?

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

#!/bin/bash
function die {
  echo "$*" >&2; exit 1
}

function checkgit {
  [ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir"
}


cd ~git/repositories/a.git
. ~git/post-receive-email &> /dev/null
( set -x
checkgit ~git/a
cd ~git/a
checkgit .
pwd
git pull
php ~git/a/scripts/generate_markdown_documentation.php )

И я получаю следующий вывод от git push:

+ checkgit /var/git/a
+ '[' -d /var/git/a/.git ']'
+ cd /var/git/a
+ checkgit .
+ '[' -d ./.git ']'
+ pwd
/var/git/a
+ git pull
fatal: Not a git repository: '.'
+ php /var/git/a/scripts/generate_markdown_documentation.php

Есть еще помощь?

О, и если я сам запускаю скрипт, он работает (я запускаю его, говоря hooks/post-receive)

Проблема обнаружена благодаря serverfault — в основном переменные среды GIT_DIR и GIT_WORK_TREE устанавливаются при запуске хука, и это негативно влияет на git pull. Удаление переменных устраняет проблему.


person Silas Snider    schedule 22.02.2010    source источник
comment
Измените git pull на pwd и посмотрите, что появится в журнале.   -  person Dennis Williamson    schedule 23.02.2010
comment
Ооо! Противный. +1 за отслеживание проблемы и устранение ее!   -  person Norman Ramsey    schedule 25.02.2010
comment
Как вы нашли файл pull_log.log? Я не знаю, где хранятся журналы...   -  person munmunbb    schedule 17.11.2015


Ответы (3)


Вам нужно больше диагностики, например,

function die {
  echo "$*" >&2; exit 1
}

function checkgit {
  [ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir"
}

На этом этапе в подоболочке сразу после круглой скобки вы можете попробовать что-то вроде

set -x # show exactly what's executed (writes to stderr)
checkgit ~git/a
cd ~git/a && checkgit . && git pull ...

Вы также можете рассмотреть возможность перенаправления всего stderr подоболочки, например,

( ... ) 2>/tmp/mydiagnosis$$.log

(Это временная мера, и она допустима только в том случае, если в логах нет конфиденциальной информации.)


Ладно, Сайлас, твоя дополнительная информация исключает множество неудобных возможностей. Я приближаюсь к концу своего git фу, но вот еще кое-что, что можно попробовать:

  1. Зайдите в ~git/a и посмотрите, сможете ли вы сделать это git pull вручную. Это должно потерпеть неудачу.
  2. Зашел в ~git/a и запустил git status. Это также должно потерпеть неудачу. Если это не так, то git выдает очень плохое сообщение об ошибке.

Если оба шага не увенчались успехом, ~git/a не тот клон, о котором вы думали. Переименуйте его, сделайте новый клон и посмотрите, сможете ли вы решить проблему.

Если первый шаг удается вручную, то происходит что-то странное, и я сбит с толку.

Если первый шаг не удался, а второй прошел успешно, у вас могут быть проблемы с ветвями:

  • Возможно, репозиторий ~git/a настроен на неправильную ветку, и вашему репо нужна ветка, которой у него нет. Попробуйте git branch -a и посмотрите, не увидите ли вы чего-нибудь неожиданного.

  • Возможно, у вас есть ветка, но она неправильно связана с удаленным репозиторием. В этот момент вы должны погрузиться в ~git/a/.git/config, и я действительно не знаю, как объяснить, что вы должны там найти. В этот момент вам понадобится настоящий эксперт по git; Я просто играю одну по телевизору.

person Norman Ramsey    schedule 23.02.2010
comment
Не могли бы вы взглянуть еще раз? Я добавил информацию, которую вы просили. - person Silas Snider; 23.02.2010
comment
@Silas: добавлено еще несколько вещей, которые можно попробовать. - person Norman Ramsey; 24.02.2010
comment
Я обнаружил настоящую проблему — см. обновленное описание выше. - person Silas Snider; 24.02.2010

Недавно я столкнулся с подобной проблемой, и я думаю, что это связано с переменными среды, которые устанавливает git, в частности с переменной $GIT_DIR. Если у вас есть этот набор, все команды git в других репозиториях начинают вести себя странно. В основном я думаю, что запуск вашего git pull внутри хука должен вызываться в нейтральной среде оболочки, которая не имеет этих странных переменных и приводит к путанице git, хотя я пока не понял, как это сделать.

person TheDeadSerious    schedule 19.10.2011

unset GIT_DIR — это решение, которое работает для фатальной ошибки, которую вы видите.

Это относится ко всем скриптам в хуках (другой распространенный — post-update), которые используют внутри себя команду git. Команда git использует GIT_DIR из env вместо pwd.

Подробнее см. https://stackoverflow.com/a/4100577.

person Sunthar    schedule 03.10.2014