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

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

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

#!/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. Сброс переменных решает проблему.

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; Я просто играю один по телевизору.

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

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

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

См. /questions/12483881/poluchit-fatal-not-git-repository-pri-ispolzovanii-perehvata-post-obnovleniya-dlya-vyipolneniya-git-pull-v-drugom-repo/12483903#12483903 для дальнейшего объяснения.

Другие вопросы по тегам