Настройка хука после получения для голого репо

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

После того, как я отправлю свой голый репозиторий git на сервер:

$ git push origin master

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

$ cd /central/workfiles
$ git pull
$ exit

Я слышал о хуке post-receive, но не знаю, как его настроить. Как я могу добиться того же.


person david.colais    schedule 22.01.2013    source источник


Ответы (3)


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

/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 вместо git pull

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

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

Это не соответствовало бы спецификации OP.

person VonC    schedule 22.01.2013
comment
Должен ли я просто создать файлы из содержимого, которое вы указали. Мне кажется, что оно находится в одной строке. - person david.colais; 22.01.2013
comment
@david.colais 3 строки: bin/sh, одна строка для вытягивания и одна строка для exit (хотя эта строка exit на самом деле не нужна) - person VonC; 22.01.2013
comment
@ david.colais, опять же, само по себе извлечение представляет собой одну строку с двумя установленными переменными среды: GIT_WORK_TREE=/central/workfiles GIT_DIR=/central/workfiles/.git git pull origin master - person VonC; 22.01.2013
comment
Позднее добавление: я считаю, что git checkout -f безопаснее, чем git pull, поскольку слияние, которое является частью извлечения, может привести к беспорядку, если потребуется ручное исправление... - person ChrisV; 09.02.2015
comment
@ChrisV действительно. Я включил ваш комментарий в ответ для большей наглядности. - person VonC; 09.02.2015
comment
Получает ли git checkout -f последние изменения с пульта? - person markasoftware; 30.03.2016
comment
@Markasoftware Вы правы, это нет. Я изменил ответ, чтобы прояснить, что проверка будет работать, только если пункт назначения не является репозиторием git (просто папка, которую вы обновляете) - person VonC; 30.03.2016

я использую крючок получения почты, как это

#.git/hooks/post-receive

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

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

person blamb    schedule 04.06.2014
comment
это тактика @VonC? добавить фрагмент от кого-то другого после ответа, чтобы получить более свежую дату и все голоса? ржу не могу. Я должен выяснить, как получить больше очков здесь. не могли бы вы удалить фрагмент кода, который дублировал мой ответ здесь, пожалуйста, если это возможно, и просто заменить его на см. @Brian Thomas, пожалуйста, чтобы я мог получить несколько баллов по этому поводу? Я пытаюсь сохранить справедливость и заработать некоторые права на переполнение, заметил это .... Спасибо за любое сотрудничество. С Уважением,. ..подождите, я только что кое о чем подумал, это вы мне намекнули? если да, то не обращайте внимания, если нет, пожалуйста :-) - person blamb; 12.08.2015

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

#!/bin/sh

cd /central/workfiles
git pull
exit

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

В итоге не забудьте сделать его исполняемым

chmod +x post-receive
person Gabriele Petronella    schedule 22.01.2013
comment
Я создал новый файл как пост-получение, но после того, как я нажму на голое репо, никакие изменения не отражаются в не голом репо, который является моим рабочим каталогом. - person david.colais; 22.01.2013
comment
Это будет работать, только если для GIT_DIR установлено значение .git, иначе вы получите ошибку - person rambi; 15.06.2021