Вопрос

Это должна быть очень простая вещь для запуска, но по какой-то причине она не будет работать с моим репозиторием Mercurial.Все, что я хочу, это чтобы удаленное репозиторий запускалось автоматически hg update всякий раз, когда кто-то подталкивает к этому.Итак, у меня есть это в моем файле .hg / hgrc:

[hook]
changegroup = hg update

Просто, не так ли?Но по какой-то причине это никогда не выполняется.Я также попытался написать сценарий оболочки, который делал это..hg / hgrc выглядел примерно так:

[hooks]
changegroup = /home/marc/bin/hg-update

и hg-обновление выглядело примерно так:

#!/bin/sh
hg help >> /home/marc/works.txt;
hg update >> /home/marc/works.txt;
exit 0;

Но опять же, это не обновляется.Содержание hg help выписываются на works.txt, но ничего не выписано для hg update.Есть ли что-то очевидное, чего я здесь не понимаю?Это мучает меня уже несколько дней, и, кажется, я просто не могу заставить это сработать.

Обновить

Итак, еще раз, используя -v включение командной строки с моей рабочей станции при нажатии на удаленный репозиторий не выводит никаких подробных сообщений, даже если они у меня есть echo строки в .hg/hgrc.Однако, когда я выполняю push из клона репозитория в той же файловой системе (я вошел в систему через SSH), это то, что я получаю:

bash-3.00$ hg -v push ../test-repo/
pushing to ../test-repo/
searching for changes
1 changesets found
running hook prechangegroup: echo "Remote repo is at `hg tip -q`"
echo "Remote repo wdir is at `hg parents -q`"
Remote repo is at 821:1f2656753c98
Remote repo wdir is at 821:1f2656753c98
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
running hook changegroup: echo "Updating.... `hg update -v`"
echo "Remote repo is at `hg tip -q`"
echo "Remote repo wdir is at `hg parents -q`"
Updating.... resolving manifests
getting license.txt
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
Remote repo is at 822:389a6c7276c6
Remote repo wdir is at 822:389a6c7276c6

Итак, это работает, но опять же только тогда, когда я нажимаю из той же файловой системы.Это не сработает, если я попытаюсь перейти к репозиторию с другой рабочей станции по сети.

Это было полезно?

Решение

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

Выходные данные должны быть перенаправлены в stderr (или /dev/null), поскольку для потока данных используется стандартный вывод .

По сути, вы не перенаправляетесь на stderr и, следовательно, не загрязняете стандартный вывод.

Другие советы

Что ж, пройдя через те же этапы разочарования, что и Марк У некоторое время назад, я, наконец, нашел решение проблемы, по крайней мере, при удаленном обслуживании с помощью скрипта hgwebdir WSGI.

Я обнаружил, что при использовании такого рода удаленной отправки через HTTP или HTTPS Mercurial просто игнорирует все, что вы записываете в файл .hg / hgrc или в ваш репозиторий.Однако, попадая на крючок в конфигурации hgwebdir делает свое дело.

Итак, если суть в вашем hgwebdir.wsgi скрипт - это что-то вроде

application = hgwebdir('hgweb.config')

раздел конфигурации [hooks] должен перейти в упомянутый hgweb.конфигурация.

Одним из недостатков является то, что эти крючки выполняются для каждое хранилище перечислены в разделе [пути] этой конфигурации.Несмотря на то, что HG предлагает другую функцию с поддержкой WSGI (hgweb вместо hgwebdir) для обслуживания только одного репозитория, она, похоже, не поддерживает никаких перехватов (и у нее нет никакой конфигурации).Это, однако, можно обойти, используя hgwebdir, как описано выше, и имея некоторый Apache RewriteRule, отображающий все в нужный подкаталог.Это работает у меня:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/reponame
RewriteRule ^(.*)$ reponame/$2 [QSA]

Получайте удовольствие, используя свои удаленные хукеры по HTTP: D

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

  • Перехваты вызываются также при переносе файловой системы.
  • Нет необходимости хранить хук в том репо, с которым вы хотите, чтобы они работали.Вы также можете написать тот же хук, что и в вашем вопросе на стороне пользователя.Вы должны изменить событие с changegroup на исходящее, а также указать URL удаленного репозитория с помощью параметра -R.Затем, если отправляющий пользователь имеет достаточные привилегии в удаленном репозитории, перехват будет выполнен успешно.

.hg/hgrc

[hooks]
outgoing = hg update -R $HG_URL

Теперь перейдем к вашей проблеме....Я предлагаю создать перехватчики prechangegroup и changegroup и распечатать некоторые результаты отладки.

.hg/hgrc

[hooks]
prechangegroup = echo "Remote repo is at `hg tip -q`"
                 echo "Remote repo wdir is at `hg parents -q`"
changegroup    = echo "Updating.... `hg update -v`"
                 echo "Remote repo is at `hg tip -q`"
                 echo "Remote repo wdir is at `hg parents -q`"

А также нажмите с помощью переключателя -v, чтобы вы могли знать, какой крючок запущен.Если вы все еще не можете разобраться, опубликуйте результат.Возможно, я смогу помочь.

Моя проблема заключалась в том, что мое приложение hgwebdir работало от имени пользователя "hg", но репозиторий принадлежал мне, поэтому мне пришлось добавить этот фрагмент конфигурации в hgweb.config, чтобы заставить его запускать перехваты:

[trusted]
users = me

Вам нужно, чтобы это было в удаленный hgrc репозиционирования.Звучит так, как будто это находится в вашем локальном репозитории.

Редактировать:Это также зависит от того, как вы нажимаете.Некоторые методы не вызывают перехваты с правой стороны.(ssh делает, я думаю, HTTP делает, файловая система делает нет)

Редактировать 2:Что, если вы нажмете "локально" на компьютере удаленного репозитория?Возможно, у вас разные пользователи / разрешения между веб-сервером и hgrc-файлом.(Смотрите [сервер] и доверенные директивы для hgrc.)

У меня была такая же проблема с запуском из Windows Eclipse через http, но после захвата stderr я обнаружил, что необходим полный путь к файлу hg.bat.Мой раздел "крючки" теперь выглядит следующим образом:

[hooks]
incoming = c:\Python27\Scripts\hg.bat update > hg_log.txt 2>>hg_err.txt

Надеюсь, это поможет кому-то еще.СтивеТ

Попробуй включение отладки подключений чтобы понять, почему он не работает.

Вероятно, проблема с разрешениями или что-то в этом роде.

потребовалось некоторое время, но у меня все получилось.

Я начал с

[hooks]
tag=set >&2
commit=set >&2

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

при удаленном запуске это должно выводиться в консоль, если оно запущено

hg push https://host/hg   -v

Это было не так.

Я использовал hgweb.cgi, поэтому переключился на hgweb.wsgi без какой-либо разницы.

что я обнаружил, так это то, что некоторые перехваты не вызываются удаленно.

когда я переключил его на

[hooks]
incoming= set >&2

тег hooks и commit, похоже, не вызываются, но incoming и changeset вызываются.Я еще не подтвердил информацию о других.

теперь, когда у меня это заработало, я снова переключился на hgweb.cgi, и все работает по-прежнему.

Причина, которую я нашел для этого, не имеет ничего общего с перенаправлением stdout Для stderr.Как вы можете видеть на странице wiki, это не указано в текущей версии wiki https://www.mercurial-scm.org/wiki/FAQ#FAQ.2FCommonProblems .В любом случае, чтобы_.27hg_push.27_and_have_an_automatic_.27hg_update.27_on_the_remote_server.3F

Проблема, которую я обнаружил, заключается в следующем разрешения.

В моей первоначальной настройке у меня был пользователь, скажем так hguser с репозиторием на его домашней странице и скриптом /etc/init.d/hg.init для запуска hg serve.Проблема в том, что hg serve управлялся root, в то время как большинство файлов в репозитории относились к hguser (некоторые из них переключились на root в какой-то момент, но это не будет иметь значения, так как я исправлю их с помощью chown)

Решение:

  • chown -R hguser:hguser /home/hguser/repo (чтобы исправить ВСЕ файлы, вернитесь к hguser)
  • запуск su hguser -c "hg serve ..." (в моем случае из /etc/init.d/hg.init)
  • changegroup = hg update -C под [hooks] в repo/.hg/hgrc как обычно

Теперь это должно сработать дальше push

PS:в моем случае я скорее обновляю до head определенной ветки, поэтому я использую hg update -C -r staging, чтобы промежуточный сервер обновлялся только до head предполагаемой ветви, даже если tip это из другой ветки (например development например)

Кстати, мой hg.init сценарий закончился примерно так:(обратите внимание на su hguser часть)

#!/bin/sh
#
# Startup script for mercurial server.
#
# @see http://jf.blogs.teximus.com/2011/01/running-mercurial-hg-serve-on-linux.html

HG=/usr/bin/hg
CONF=/etc/mercurial/hgweb.config
# Path to PID file of running mercurial process.
PID_FILE=/etc/mercurial/hg.pid

state=$1

case "$state" in
'start')
    echo "Mecurial Server service starting."
    (su hguser -c "${HG} serve -d --webdir-conf ${CONF} -p 8000 --pid-file ${PID_FILE}")
  ;;

'stop')
  if [ -f "${PID_FILE}" ]; then
    PID=`cat "${PID_FILE}"`
    if [ "${PID}" -gt 1 ]; then
      kill -TERM ${PID}
      echo "Stopping the Mercurial service PID=${PID}."
    else
      echo Bad PID for Mercurial -- \"${PID}\"
    fi
  else

    echo No PID file recorded for mercurial
  fi
  ;;

*)
  echo "$0 {start|stop}"
  exit 1
  ;;
esac

PS:причитающийся кредит http://jf.blogs.teximus.com/2011/01/running-mercurial-hg-serve-on-linux.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top