Мерзавец постполучает рычаг, не работающий

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

Поэтому в ~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 установлены, когда рычаг работает, и они плохо влияют на получение по запросу мерзавца. Сбрасывание переменных решает проблему.

12
задан Community 13 April 2017 в 12:13
поделиться

1 ответ

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

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 fu, но вот еще несколько вещей, которые можно попробовать:

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

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

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

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

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

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

3
ответ дан 2 December 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: