Dies sollte eine sehr einfache Sache sein, aber aus irgendeinem Grund funktioniert es nicht mit meinem Mercurial-Repository. Ich möchte nur, dass der Remote-Repo hg update
automatisch ausführt, wenn jemand darauf drückt. Also ich habe das in meiner .hg / hgrc Datei:
Einfach, oder? Aber aus irgendeinem Grund wird dies nie ausgeführt. Ich habe auch versucht, ein Shell-Skript zu schreiben, das das getan hat. .hg / hgrc sah so aus:
%Vor%und hg-update sahen so aus:
%Vor% Aber auch das wird nicht aktualisiert. Der Inhalt von hg help
wird in works.txt
geschrieben, für hg update
wird jedoch nichts ausgegeben. Gibt es etwas Offensichtliches, dass ich hier vermisse? Das hat mich tagelang geplagt und ich kann es einfach nicht zur Arbeit bringen.
Aktualisieren
Okay, wenn ich den Schalter -v
in der Befehlszeile von meiner Workstation verwende, der zum Remote-Repo schiebt, werden keine ausführlichen Nachrichten gedruckt, selbst wenn ich diese echo
-Zeilen in .hg/hgrc
habe. Wenn ich jedoch einen Push von einem Klon des Repos auf dem gleichen Dateisystem mache (ich bin über SSH angemeldet), bekomme ich Folgendes:
So klappt es, aber nochmal nur wenn ich vom selben Dateisystem drücke. Es funktioniert nicht, wenn ich versuche, von einer anderen Workstation über das Netzwerk zum Repo zu gelangen.
Ich habe einige Zeit damit verbracht, selbst darüber zu recherchieren. Ich denke, die Antwort auf das Problem wird knapp beschrieben hier :
Die Ausgabe muss nach stderr (oder / dev / null) umgeleitet werden, da stdout wird für den Datenstrom verwendet.
Im Grunde werden Sie nicht zu stderr umleiten und somit stdout verschmutzen.
Nun, nachdem ich die gleichen Frustrationsschritte wie Marc W vor einiger Zeit gemacht hatte, fand ich endlich die Lösung für das Problem, zumindest, wenn Remote-Serving mit dem hgwebdir WSGI-Skript gemacht wurde.
Ich habe herausgefunden, dass Mercurial bei Verwendung dieser Art von Remote-Push über HTTP oder HTTPS einfach alles ignoriert, was Sie in die .hg / hgrc-Datei oder Ihr Repository schreiben. Die Eingabe des Hooks in der hgwebdir-Konfiguration funktioniert jedoch.
Also, wenn die untere Zeile in Ihrem hgwebdir.wsgi -Skript etwas wie
ist %Vor%Der Abschnitt [hooks] config muss in die erwähnte hgweb.config gehen.
Ein Nachteil ist, dass diese Hooks für jedes Repository ausgeführt werden, das im Abschnitt [paths] dieser Konfiguration aufgeführt ist. Obwohl HG eine andere WSGI-fähige Funktion (hgweb statt hgwebdir) anbietet, um nur ein einziges Repository zu bedienen, scheint dieses keine Hooks zu unterstützen (auch keine Konfiguration). Dies kann jedoch umgangen werden, indem ein hgwebdir wie oben beschrieben verwendet wird und Apache RewriteRule alles in das gewünschte Unterverzeichnis abbildet. Dieser funktioniert für mich:
%Vor%Viel Spaß mit Ihren Remote-Hooks über HTTP: D
Zunächst möchte ich ein paar Kommentare oben korrigieren.
Nun zu Ihrem Problem .... Ich schlage vor, sowohl prechangegroup und changegroup Hooks zu erstellen und einige Debugging-Ausgaben zu drucken.
Und drücken Sie auch den Schalter -v, damit Sie wissen, welcher Hook läuft. Wenn Sie immer noch nicht herausfinden können, veröffentlichen Sie die Ausgabe. Ich könnte vielleicht helfen.
Sie müssen es in der Remote -Repository-Datei hgrc haben. Es klingt, als ob es in Ihrem lokalen Repo ist.
Edit: Es hängt auch davon ab, wie Sie drängen. Einige Methoden rufen auf der rechten Seite keine Haken auf. (ssh tut, ich denke, HTTP tut, Dateisystem tut nicht )
Edit2: Was passiert, wenn Sie "lokal" auf den Computer des entfernten Repos drücken? Sie haben möglicherweise unterschiedliche Benutzer / Berechtigungen zwischen dem Webserver und der hgrc-Datei. (Siehe [server] und vertrauenswürdige Direktiven für hgrc.)
Probieren Sie das Debugging von hook aus , um zu sehen, warum es so ist läuft nicht.
Wahrscheinlich ein Berechtigungsproblem oder etwas ähnliches.
dauerte eine Weile, aber ich habe es funktioniert.
Ich habe mit
angefangen %Vor%das & gt; & amp; 2 pipes es auf Standardfehler so Remote-Konsolen werden es zeigen.
wenn remote sollte dies in der Konsole ausgegeben werden, wenn es ausgeführt wird
%Vor%Es war nicht.
Ich habe hgweb.cgi benutzt, also bin ich ohne Unterschied zu hgweb.wsgi gewechselt.
Was ich entdeckt habe ist, dass einige Hooks nicht remote aufgerufen werden.
wenn ich es auf
umgestellt habe %Vor%Das Hook-Tag und das Commit scheinen nicht aufgerufen zu werden, aber eingehende und Changeset werden aufgerufen. Ich habe die anderen nicht bestätigt.
Jetzt, da ich es funktionierte, wechselte ich zurück zu hgweb.cgi und alles funktioniert gleich.
Der Grund, den ich dafür gefunden habe, hat nichts mit der Umleitung von stdout
zu stderr
zu tun. Wie Sie vielleicht auf der Wiki-Seite sehen, ist es in der aktuellen Version des Wikis nicht angegeben
Ссылка
Das Problem, das ich gefunden habe, ist um Berechtigungen .
In meinem ursprünglichen Setup hatte ich einen Benutzer, sagen wir hguser
mit einem Repo auf seinem Heim und einem Skript /etc/init.d/hg.init
, um hg serve
zu starten. Das Problem hg serve
wurde von root
ausgeführt, während die meisten Dateien unter dem Repo hguser
betrafen (einige von ihnen wechselten irgendwann zu root
, aber es macht mir nichts aus, da ich korrigiere sie mit chown
)
Lösung:
chown -R hguser:hguser /home/hguser/repo
(um ALLE Dateien zu korrigieren, zurück zu hguser) 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 üblich Jetzt sollte es auf push
PS: In meinem Fall werde ich lieber auf den Kopf eines bestimmten Zweiges aktualisieren, also verwende ich hg update -C -r staging
, um den Staging-Server nur für den Kopf des beabsichtigten Zweigs zu aktualisieren, selbst wenn tip
von ist ein anderer Zweig (wie zB development
)
Übrigens mein hg.init
Skript endete wie folgt: (beachte den su hguser
Teil)
PS: Dankeschön an Ссылка
Tags und Links mercurial version-control mercurial-hook