문제

이것은 실행하기가 매우 간단해야 하지만 어떤 이유로 내 Mercurial 저장소에서는 작동하지 않습니다.내가 원하는 것은 원격 저장소가 자동으로 실행되는 것입니다. hg update 누군가가 밀어붙일 때마다.그래서 내 .hg/hgrc 파일에 다음이 있습니다.

[hook]
changegroup = hg update

간단하죠?그러나 어떤 이유로든 이것은 실행되지 않습니다.나는 또한 이를 수행하는 쉘 스크립트를 작성해 보았습니다..hg/hgrc는 다음과 같습니다.

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

hg-update는 다음과 같습니다.

#!/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.그러나 동일한 파일 시스템의 저장소 복제본에서 푸시를 수행하면(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

그래서 작동하지만 동일한 파일 시스템에서 푸시할 때만 다시 작동합니다.네트워크를 통해 다른 워크스테이션에서 저장소로 푸시하려고 하면 작동하지 않습니다.

도움이 되었습니까?

해결책

나는 이것을 직접 조사하는 데 시간을 보냈습니다.문제에 대한 답이 간결하게 설명되어 있다고 생각합니다. 여기:

STDOUT가 데이터 스트림에 사용되기 때문에 출력은 stderr (또는 /dev /null)로 리디렉션되어야합니다.

기본적으로 stderr로 리디렉션되지 않으므로 stdout이 오염됩니다.

다른 팁

글쎄, Marc W가 얼마 전 겪은 것과 같은 좌절의 단계를 거친 후, 적어도 hgwebdir WSGI 스크립트를 사용하여 원격 서비스가 완료되면 마침내 문제에 대한 해결책을 찾았습니다.

HTTP 또는 HTTPS를 통해 이러한 종류의 원격 푸시를 사용할 때 Mercurial은 .hg/hgrc 파일이나 저장소에 작성한 모든 내용을 단순히 무시한다는 것을 알았습니다.그러나 후크에 들어가는 hgwebdir 구성에서 트릭을 수행합니다.

따라서 귀하의 최종 결론이 hgwebdir.wsgi 스크립트는 다음과 같습니다

application = hgwebdir('hgweb.config')

[hooks] 구성 섹션은 언급된 항목으로 들어가야 합니다. hgweb.config.

한 가지 단점은 이러한 후크가 다음을 위해 실행된다는 것입니다. 모든 저장소 해당 구성의 [paths] 섹션에 나열되어 있습니다.HG가 단일 저장소만 제공하기 위해 또 다른 WSGI 가능 기능(hgwebdir 대신 hgweb)을 제공하더라도 해당 기능은 후크를 지원하지 않는 것 같습니다(구성도 없습니다).그러나 위에서 설명한 대로 hgwebdir을 사용하고 일부 Apache RewriteRule이 모든 것을 원하는 하위 디렉터리에 매핑하도록 하면 이를 피할 수 있습니다.이것은 나에게 효과적입니다.

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

HTTP를 통해 원격 후크를 사용해 보세요. :D

우선 위의 몇 가지 의견을 정정하고 싶습니다.

  • 파일 시스템을 푸시할 때도 후크가 호출됩니다.
  • 작동하려는 저장소에 후크를 유지할 필요는 없습니다.사용자 측에서 질문과 동일한 후크를 작성할 수도 있습니다.이벤트를 변경 그룹에서 발신으로 변경하고 -R 스위치를 사용하여 원격 저장소의 URL을 지정해야 합니다.그런 다음 푸시 사용자에게 원격 저장소에 대한 충분한 권한이 있으면 후크가 성공적으로 실행됩니다.

.hg/hgrc

[hooks]
outgoing = hg update -R $HG_URL

이제 당신의 문제를 향해....사전 변경 그룹 및 변경 그룹 후크를 모두 생성하고 일부 디버깅 출력을 인쇄하는 것이 좋습니다.

.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 파일 간에 서로 다른 사용자/권한이 있을 수 있습니다.([server] 및 hgrc에 대한 신뢰할 수 있는 지시어를 참조하세요.)

http를 통해 Windows Eclipse에서 푸시하는 것과 동일한 문제가 있었지만 stderr을 캡처한 후 hg.bat 파일에 대한 전체 경로가 필요하다는 것을 알았습니다.내 후크 섹션은 이제 다음과 같습니다.

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

이것이 다른 사람에게 도움이 되기를 바랍니다.스티브T

노력하다 후크 디버깅 켜기 왜 실행되지 않는지 확인하세요.

권한 문제나 그와 유사한 문제일 가능성이 높습니다.

시간이 좀 걸렸지만 작동하게 되었습니다.

나는 시작했다

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

>&2는 이를 표준 오류로 파이프하여 원격 콘솔에 표시합니다.

원격에서 실행 중이면 콘솔에 출력되어야 합니다.

hg push https://host/hg   -v

그렇지 않았습니다.

저는 hgweb.cgi를 사용하고 있었기 때문에 아무런 차이 없이 hgweb.wsgi로 전환했습니다.

내가 발견한 것은 일부 후크가 원격에서 호출되지 않는다는 것입니다.

내가 그걸로 바꿨을 때

[hooks]
incoming= set >&2

후크 태그와 커밋은 호출되지 않는 것 같지만 수신 및 변경 집합은 호출됩니다.다른 사람들은 확인하지 않았습니다.

이제 작동이 완료되었으므로 hgweb.cgi로 다시 전환했는데 모든 것이 동일하게 작동합니다.

내가 찾은 이유는 리디렉션과 관련이 없습니다. stdout 에게 stderr.위키 페이지에서 볼 수 있듯이 위키의 현재 버전에는 지정되어 있지 않습니다.https://www.mercurial-scm.org/wiki/FAQ#FAQ.2FCommonProblems.Any_way_to_.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

추신:내 경우에는 특정 브랜치의 헤드로 업데이트하는 편이 낫기 때문에 다음을 사용합니다. hg update -C -r staging, 스테이징 서버가 의도한 분기의 헤드에만 업데이트되도록 하려면 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

추신:정당한 신용 http://jf.blogs.teximus.com/2011/01/running-mercurial-hg-serve-on-linux.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top