Мы используем мерзавца с центральным 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
установлены, когда рычаг работает, и они плохо влияют на получение по запросу мерзавца. Сбрасывание переменных решает проблему.
Вам нужно больше диагностики, например,
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, но вот еще несколько вещей, которые можно попробовать:
~git/a
и посмотрите, можете ли вы сделать git pull
вручную. Это должно привести к неудаче. ~git/a
и запустите git status
. Это также должно завершиться неудачей. Если нет, то git
выдает очень плохое сообщение об ошибке. Если оба шага не сработали, ~git/a
- это не тот клон, за который вы его приняли. Переименуйте его, создайте новый клон и посмотрите, сохранится ли проблема.
Если первый шаг удастся выполнить вручную, значит, происходит что-то странное, и я в недоумении.
Если первый шаг не удался, а второй удался, возможно, у вас проблема с ветками:
Возможно, репозиторий ~git/a
установлен на неправильную ветку, и вашему репозиторию нужна ветка, которой у него нет. Попробуйте git branch -a
и посмотрите, не появится ли что-то неожиданное.
Возможно, у вас есть ветвь, но она неправильно связана с удаленным репозиторием. На этом этапе вам придётся погрузиться в ~git/a/.git/config
, и я не знаю, как объяснить, что вы должны там найти. В этот момент вам понадобится настоящий эксперт по git; я просто играю в него на телевидении.