Подтвердить что ты не робот

Сила git для запуска post-receive hook, даже если все "обновлено",

Как заставить git запускать привязку post-receive на сервере, даже если у меня нет новой фиксации для нажатия?

Фон

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

Я устал от изменения крюка post-receive вручную на сервере, поэтому мой крюк post-receive теперь фактически копирует новую версию себя из репо:

#!/bin/sh

rm -rf ~/../protected/*
GIT_WORK_TREE=~/../protected git checkout -f

# Rewrite over this file with any updates from the post-receive file
cp ~/../protected/post-receive hooks/post-receive

# Delete public_html
# Copy stuff public_html

Проблема, конечно, в том, что новый трюк post-receive никогда не запускается. Казалось бы, простое решение было бы просто снова нажать, но теперь все уже обновлено. Это раздражает, потому что он требует, чтобы я подделывал новую фиксацию каждый раз, когда я обновляю крюк post-receive. Есть ли способ вызвать крюк post-receive без подделки фиксации или ssh ing?

Что я пробовал

git push
git push -f
4b9b3361

Ответ 1

Использовать '-allow-empty'

После первого нажатия кнопки script вы можете сделать это:

git commit --allow-empty -m 'push to execute post-receive'

Флаг --allow-empty переопределяет поведение git по умолчанию, препятствующее совершению фиксации при отсутствии изменений.

Используйте псевдоним и упростите свою жизнь

Добавьте следующее в ~/.gitconfig

[alias]
    pushpr = "!f() { git push origin master;git commit --allow-empty -m 'push to execute post-receive';git push origin master; }; f"

Теперь просто сделайте git pushpr

git pushpr

Это приведет к любым изменениям в master, которые в вашем случае вызовут замену вашего почтового сообщения script, затем он снова будет нажат (используя флаг --allow-empty), который затем выполнит ваш обновленный post-receive script.

Ответ 2

Я знаю, что это, вероятно, будет считаться "опасным", но мне нравится жить на грани.

Я просто удаляю удаленную ветку и снова нажимаю ее. Удостоверьтесь, что ваш локальный филиал обновлен первым, чтобы ограничить вероятность потери материала.

Итак, если я хочу запустить post-receive, в моем случае, чтобы получить ветвь тестирования для обеспечения, все, что я делаю, это:

$ git push origin :testing
$ git push origin testing

Не принимайте это как ответ, хотя. Это скорее всего просто FYI.

Ответ 3

Я боюсь, что вы должны ssh на сервер и запустите hook script вручную. git push не заставляет сервер выполнять предварительные и предварительные приемные и пост-приемные крючки, если ничего не добавлено (т.е. когда git печатает все обновленное).

Остальная часть ответа касается отслеживания версии отслеживания после получения, поэтому вы можете изменить его без sshing на сервер.

Добавить оболочку script с именем do-post-receive в локальный репозиторий:

$ ls -ld .git
$ echo 'echo "Hello, World!"' >do-post-receive
$ git add do-post-receive
$ git commit do-post-receive -m 'added do-post-receive'

Замените ваш крюк hooks/post-receive на сервере:

#! /bin/sh
while read OLDID NEWID BRANCH; do
  test "$BRANCH" = refs/heads/master && eval "$(git show master:do-post-receive)"
done

(Убедитесь, что на сервере chmod 755 hooks/post-receive.)

Настройте свои изменения из локального репозитория на сервер и посмотрите, как выполняется ваш код do-post-receive:

$ git push origin master
...
remote: Hello, World!
...

Ответ 5

Мне нравится предложение Джейми Карла, но оно не работает, и я получил ошибку:

remote: error: по умолчанию удаление текущей ветки отклонено, потому что следующая ошибка: 'git clone' не приведет к извлечению файла, что приведет к путанице.

В моем случае я тестирую post-receive hooks на моем localhost против открытого репозитория. Предупреждение/супер важно, запустите эту команду только на сервере remote!

git update-ref -d refs/heads/develop 

Он удалит ссылку для ветки разработки (вам также может понадобиться удалить любой из файлов, которые вы развернули для этой ветки), затем вы можете пойти и сделать git push deploy_localtest develop или любую команду push, которую вы хотите для эта ветка.

Ответ 6

В моем случае я вхожу в пульт и запускаю:

$ sh project.git/hooks/post-receive

отлично работает!