получение «фатально: не репозиторий git: '.'» при использовании обработчика post-update для выполнения «git pull» в другом репо

90

Я новичок в git, поэтому прошу прощения (и, пожалуйста, поправьте меня), если я неправильно использую терминологию здесь, но я сделаю все возможное.

Я пытаюсь настроить репозиторий git (концентратор) и рабочую копию сайта разработки (премьер) на веб-сервере. Я попытался скопировать его по образцу этой статьи . Я хочу, чтобы рабочая копия для разработки обновлялась всякий раз, когда отправляется репозиторий хаба. У меня сложилось впечатление, что для этого нужен подходящий хук post-update, который я создал вот так:

#!/bin/sh
whoami
cd /path/to/working-copy/
RET=`git pull`
echo $RET

Обновить

Когда я отправляю изменения из локального репозитория в пустой концентратор, я получаю следующий результат сценария после обновления:

remote: sites
remote: fatal: Not a git repository: '.'

Однако, если я использую SSH на сервере как пользовательские «сайты» и выполняю этот сценарий вручную, он отлично работает. Любые идеи относительно того, что может пойти не так с этим крючком или скриптом?

Ty W
источник

Ответы:

179

Вот сценарий, который в итоге сработал. Я думаю, что то, чего мне изначально не хватало, что мешало удаленной работе, былоunset GIT_DIR

#!/bin/sh
cd /path/to/working-copy/ || exit
unset GIT_DIR
git pull repo branch

exec git-update-server-info
Ty W
источник
18
Могу подтвердить, снятие настройки GIT_DIRрешает проблему.
jmtd
16
Для тех, кто хочет понять, почему: это потому, что git использует переменную GIT_DIRвместо PWD. cd-ing меняет PWDне то GIT_DIR. В git должен быть запасной вариант от GIT_DIRдо, PWDесли первый недоступен.
zupa
Вопрос в том, почему git должен видеть необходимость сделать это для скрипта перехвата (установите GIT_DIR так, чтобы даже в скрипте было 'cd' в другом месте 'git something' по-прежнему работал)? Лично я бы предпочел, чтобы git не творил такого рода магию.
Стивен Харьянто
2
Причина в том, что Git применяет некоторые переменные среды ко всем основным командам git.
Кейси,
Что происходит, если после этого возникает конфликт слияния git pull?
lolololol ol 07
29

Вместо этого попробуйте:

#!/bin/sh
cd /path/to/working-copy/
env -i git pull
Жеральдо Луис да Силва Рибейро
источник
0

Несмотря на это, GIT_DIR просто работает.

проблема возникает, когда вы неправильно устанавливаете GIT_DIR в другом месте.

вы можете просто добавить это вместо: GIT_DIR = .git / Он будет работать

Цвика Навех
источник
0

В моем случае я указал рабочее дерево, и это нарушает некоторые команды, например pull(или, точнее, fetch).

Чтобы отключить рабочее дерево, если оно есть в вашей конфигурации git, выполните:

git config --unset core.worktree

(Есть и другие способы установить дерево работы)

Важно отметить,

Практически ничего не изменится в том, что это ваша проблема, если вы сами не вырыли эту яму вокруг себя, в первую очередь, используя собственное рабочее дерево.

Подшучивание:

Это означает, что .git/в некоторых случаях внутренние компоненты git используют пути относительно рабочего дерева + . По моему опыту, рабочие деревья не очень хорошо поддерживаются, за исключением самых фундаментальных частей git. Я не экспериментировал тщательно, Git, вероятно, будет вести себя, если я правильно настрою переменную конфигурации каталога git, с которой я не играл.

ТорСаммонер
источник
-1

Вероятно, у вас проблема с разрешениями. Я не уверен, как вы настроили свое голое репозиторий git, но если он работает от имени gitпользователя, убедитесь, что gitему разрешено выполнятьgit pull в каталоге вашего проекта.

При желании попробуйте это, чтобы узнать, каким пользователем вы являетесь при запуске ловушки:

echo `whoami`
Ариеджан
источник
если я подключусь к серверу по ssh как пользователь git, я могу без проблем использовать git pull в моем каталоге проекта. Я считаю, что это пользователь, который должен выполнять сценарий. Я могу попробовать добавить в скрипт строку whoami, но куда делся вывод этого скрипта, когда он выполняется как перехватчик? Может, мне нужно отправить этот вывод в файл журнала вместо повторения?
Ty W
Что echo `whoami`делать , что whoamiне делает?
Christoffer Hammarström
Вывод на стандартный вывод из сценария ловушки виден удаленному, выполняющему действие. Или, другими словами, если вы скажете «git push», вывод ловушки на пульте дистанционного управления будет отображаться в вашем stdout.
ebneter
да, заметил это, когда играл с вещами. очень удобно :)
Ty W