Frage

Dies sollte eine sehr einfache Sache haben laufen, aber aus irgendeinem Grunde wird es nicht mit meiner Mercurial-Repository arbeiten. automatisch ausgeführt hg update wenn jemand schiebt es alles, was ich für die Remote-Repo will. So habe ich dies in meinem .hg / hgrc-Datei:

[hook]
changegroup = hg update

Einfach, nicht wahr? Aber aus irgendeinem Grund, führt dies nie. Ich habe auch versucht, einen Shell-Skript zu schreiben, die das getan haben. .hg / hgrc sah wie folgt aus:

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

und hg-update sah wie folgt aus:

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

Aber noch einmal, diese nicht aktualisiert. Der Inhalt hg help ist works.txt geschrieben, aber nichts für hg update geschrieben. Gibt es etwas offensichtlich fehle ich hier? Dies hat seit Tagen plagt mich und ich kann einfach nicht scheinen, um es. Arbeit

Aktualisieren

Okay, so wieder, mit dem -v Schalter in der Befehlszeile von meinem Arbeitsplatz an die Remote-Repo schieben druckt keine ausführlichen Meldungen, auch wenn ich diese echo Linien in .hg/hgrc habe. Allerdings, wenn ich von einem Klon des Repo auf dem gleichen Dateisystem einen Push zu tun (ich bin über SSH angemeldet), das ist, was ich bekommen:

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

So funktioniert es, aber erst wieder, wenn ich aus dem gleichen Dateisystem drücken. Es funktioniert nicht, wenn ich von einem anderen Arbeitsplatz über das Netzwerk an den Repo versuchen drücken.

War es hilfreich?

Lösung

Ich verbrachte einige Zeit, diese selbst zu erforschen. Ich denke, die Antwort auf Problem prägnant beschrieben hier :

  

Ausgabe muss auf stderr umgeleitet werden (oder / dev / null), weil stdout   wird für den Datenstrom verwendet wird.

Grundsätzlich Sie Umleitung nicht in stderr und damit stdout verschmutzen.

Andere Tipps

Nun, nachdem sie durch die gleichen Schritte der Frustration gehen, wie Marc W vor einer Weile tat, fand ich endlich die Lösung für das Problem, zumindest, wenn die Fern Portion mit dem hgwebdir WSGI Skript ausgeführt wird.

fand ich heraus, dass, wenn diese Art von Remote-Push über HTTP oder HTTPS verwenden, Mercurial einfach alles ignoriert man in die .hg / hgrc Datei oder Repository schreiben. Allerdings Eingabe der Haken in der hgwebdir Config funktioniert der Trick.

Also, wenn die untere Zeile in hgwebdir.wsgi Skript ist so etwas wie

application = hgwebdir('hgweb.config')

der [Haken] Config-Abschnitt muss in die genannten gehen hgweb.config .

Ein Nachteil ist, dass dieser Haken für ausgeführt wird jedes Repository aufgeführt im Abschnitt [Paths] diese Konfiguration. Auch wenn HG andere WSGI-fähige Funktion (hgweb statt hgwebdir) bietet nur ein einziges Repository zu dienen, dass man scheint keinen Haken zu unterstützen (weder sie jede Konfiguration haben). Dies kann jedoch durch die Verwendung eines hgwebdir umgangen werden, wie oben beschrieben und mit einigen Apache RewriteRule alles in die gewünschte Unterverzeichnis abzubilden. Dies funktioniert für mich:

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

Viel Spaß beim Remote-Hooks über HTTP: D

Zu allererst möchte ich über ein paar Kommentare zu korrigieren.

  • Haken sind auch aufgerufen, wenn über Dateisystem drücken.
  • Es ist nicht notwendig, den Haken im Repo zu halten, auf dem sie arbeiten möchten. Sie können auch die gleichen Haken wie in Ihrer Frage auf der Benutzerseite schreiben. Sie haben die Veranstaltung von changegroup zu abgehend ändern und auch die URL der Remote-Repo mit dem R-Schalter angeben. Dann, wenn der Schub Benutzer über ausreichende Berechtigungen auf der Remote-Repo hat, wird der Haken erfolgreich auszuführen.

.hg / hgrc

[hooks]
outgoing = hg update -R $HG_URL

Nun zu Ihrem Problem .... Ich schlage vor, was sowohl prechangegroup und changegroup Haken und Druck einig Debug-Ausgabe.

.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`"

Und drücken Sie auch mit der Option -v, so dass Sie wissen, welche Haken läuft. Wenn Sie immer noch nicht herausfinden, schreibt die Ausgabe. Ich könnte in der Lage sein, zu helfen.

Mein Problem war, dass meine hgwebdir Anwendung als „hg“ Benutzer lief, wurde aber das Repository von mir Besitz, also musste ich in diesem Stück config in dem hgweb.config um es zu bekommen, die Haken laufen:

[trusted]
users = me

Sie müssen es haben in der Remote repositiory des hgrc. Es klingt, als ob es in Ihrem lokalen Repo ist.

Edit: Es hängt auch davon ab, wie Sie schieben. Einige Methoden aufrufen keine Haken auf der rechten Seite. (Ssh tut, ich denke, HTTP tut, Dateisystem nicht )

Edit2: Was ist, wenn Sie "vor Ort" an dem Remote-Repo-Computer drücken. Sie könnten verschiedene Benutzer / Berechtigungen zwischen dem Web-Server haben und die hgrc-Datei. (Siehe [Server] und vertrauenswürdige Richtlinien für hgrc.)

Ich hatte das gleiche Problem von Windows-Eclipse-per http schieben, aber nach der Aufnahme stderr, fand ich, dass der vollständige Pfad zur Datei hg.bat benötigt wurde. Mein Haken Abschnitt sieht nun wie:

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

Hope, das hilft jemand anderes.   SteveT

Versuchen Sie auf Haken Debuggen Drehen um zu sehen, warum es nicht läuft.

Wahrscheinlich ein Problem mit den Berechtigungen oder so ähnlich.

hat eine Weile gedauert, aber ich habe es funktioniert.

Ich begann mit

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

die> & 2 Rohren es Standardfehler so Remote-Konsolen wird es zeigen.

, wenn die Fern dieses ausgeben soll in der Konsole, wenn es ausgeführt

hg push https://host/hg   -v

Es war nicht.

Ich war mit hgweb.cgi so wechselte ich ohne Unterschied hgweb.wsgi.

, was ich entdeckt, dass einige Haken nicht auf Remote aufgerufen.

, wenn ich schaltete es auf

[hooks]
incoming= set >&2

den Haken Tag und commit scheint nicht genannt werden, aber eingehende und changeset nicht aufgerufen. Ich habe die anderen nicht bestätigt.

jetzt, dass ich habe es funktioniert ich wieder nach hgweb.cgi schaltet und alles funktioniert gleich.

Tthe Grund, warum ich gefunden habe dies nichts mit Umleitung stdout zu tun hat stderr. Wie Sie in der Wiki-Seite sehen kann, ist es nicht auf die aktuelle Version des Wiki angegeben 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

Das Problem, das ich gefunden habe, ist um Berechtigungen .

In meinem ursprünglichen Setup, ich einen Benutzer hatte, sagen wir mal hguser mit einem Repo auf seine Heimat, und einem Skript /etc/init.d/hg.init hg serve zu starten. Das Problem ist hg serve wurde von root ausgeführt werden, während der meisten Dateien im Repo hguser betrafen (einige von ihnen eingeschaltet irgendwann root, aber es wird nichts dagegen, da ich sie mit chown korrigieren würde)

Lösung:

  • chown -R hguser:hguser /home/hguser/repo (auf alle Dateien zu korrigieren, zurück zu hguser)
  • Start su hguser -c "hg serve ..." (in meinem Fall von /etc/init.d/hg.init)
  • changegroup = hg update -C unter [hooks] in repo/.hg/hgrc wie gewohnt

Nun sollte es auf push arbeitet

PS: in meinem Fall, ich aktualisiere eher auf den Kopf eines bestimmten Zweiges, so dass ich hg update -C -r staging, das Staging-Server-Update auf den Kopf des beabsichtigten Zweiges nur zu machen, auch wenn die tip aus einem anderen Zweig (wie development zum Beispiel)

BTW mein hg.init Skript wie folgt endet: (man beachte den su hguser Teil)

#!/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: gebührende Anerkennung zu http : //jf.blogs.teximus.com/2011/01/running-mercurial-hg-serve-on-linux.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top