2010-02-22 6 views
12

Мы используем git с центральным репо (используя Gitosis). Я создал крюк post-receive для генерации сообщения электронной почты в список рассылки dev, когда изменения переносятся в центральное репо, и для создания документации из папки документации в git repo.Git post-receive hook не работает

Следовательно, в ~ git/у меня есть каталог, мы будем называть его 'a', который содержит клон git repo. Пост-приемный крючок выглядит так:

#!/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) 

И я получаю следующий выход из мерзавца толчка:

+ 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 

Любой помощь?

О, и если я бегу сценарий сам, это работает (я запускаю его, говоря, Крючки/после приема)

Обнаруженные проблемы, благодаря serverfault - в основном, переменные окружения GIT_DIR и GIT_WORK_TREE установлены когда крюк бежит, и они влияют на git тянуть неблагоприятно. Исправление переменных устраняет проблему.

+2

Измените 'git pull' на' pwd' и посмотрите, что отображается в журнале. –

+0

Oooh! Насти. +1 для отслеживания проблемы и ее убийства! –

+0

Как вы нашли файл pull_log.log? Я не знаю, где хранятся журналы ... – munmunbb

ответ

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 ... 

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

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

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


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

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

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

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

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

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

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

+0

Не могли бы вы еще раз взглянуть? Я добавил информацию, которую вы просили. – Silas

+1

@ Силас: Добавлено еще несколько вещей, чтобы попробовать. –

+0

Я обнаружил реальную проблему - см. Обновленное описание выше. – Silas

0

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

0

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

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

См. https://stackoverflow.com/a/4100577 для более подробного объяснения.