Mercurial 후크가 제대로 실행되지 않습니다.
-
21-08-2019 - |
문제
이것은 실행하기가 매우 간단해야 하지만 어떤 이유로 내 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