получение «фатально: не репозиторий 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 на сервере как пользовательские «сайты» и выполняю этот сценарий вручную, он отлично работает. Любые идеи относительно того, что может пойти не так с этим крючком или скриптом?

Ответы:


179

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

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

exec git-update-server-info

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.