Настройка крюка после приема для голого репо

У меня есть голое репо, настроенное на моем сервере ubuntu.

После того, как я нажму на мой голый репортай git на сервер:

$ git push origin master

Я хочу, чтобы содержимое моего не голого репо обновлялось последним нажатием, как показано, где не голый репо - это моя фактическая рабочая директория с именем workfiles.

$ cd /central/workfiles
$ git pull
$ exit

Я слышал о крюке после приема, но не знаю, как настроить то же самое. Как я могу достичь того же.

Ответ 1

Я предпочитаю указывать рабочее дерево и каталог git вместо того, чтобы полагаться на cd:

/bare/repo.git/hooks/post-receive

#!/bin/sh
GIT_WORK_TREE=/central/workfiles GIT_DIR=/central/workfiles/.git git pull origin master
exit

Как ниже, чем, ChrisV, вы можете также полагаться на один git checkout вместо a git pull

Я считаю, что git checkout -f безопаснее, чем git pull, поскольку слияние, являющееся частью тяги, потенциально может вызвать проблемы, если нужны ручные исправления.

Но это означает, что /central/workfiles не является "не-голым" git репо. Это просто папка, в которой вы просматриваете содержимое голого репо /bare/repo.git.
См. Брайан Томас ответ на примере этого подхода.

Это не соответствует спецификации OP.

Ответ 2

Я использую этот прием, например,

#.git/hooks/post-receive

#!/bin/sh
GIT_WORK_TREE=/srv/http/sitedir/ git checkout -f

да, обязательно сделайте его выполнимым.

Ответ 3

Я бы пошел с чем-то вроде

#!/bin/sh

cd /central/workfiles
git pull
exit

Сохраните выше script как post-receive и поместите его в каталог hooks/ вашего голого репо.

В нижней строке не забудьте сделать его выполнимым

chmod +x post-receive