Mercurial steckte "Warten auf Schloss"

346

Beim Klonen eines Quecksilber-Repositorys wurde in Windows ein Bluescreen angezeigt.

Nach dem Neustart erhalte ich jetzt diese Meldung für fast alle hg-Befehle:

c: \ src \> hg commit
Warten auf Sperre für Repository c: \ src \ McVrsServer von '\ x00 \ x00 \ x00 \ x00 \ x00 \
x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 '
unterbrochen!

Google ist keine Hilfe.

Irgendwelche Tipps?

jm.
quelle
3
Wow, ich hatte auch einen Bluescreen beim Festschreiben und bekam den gleichen Fehler. Ich bin froh, dass ich nicht der einzige bin!
CBarr
3
Ich schlug ein besseres Feedback der Fehlermeldung unter bz.selenic.com/show_bug.cgi?id=4752 vor
Karl Richter

Antworten:

489

Wenn Sie auf die Sperre des Repositorys warten, löschen Sie die Repository-Datei: .hg/wlock(oder sie befindet sich möglicherweise in .hg/store/lock)

Wenn Sie die Sperrdatei löschen, müssen Sie sicherstellen, dass nichts anderes auf das Repository zugreift. (Wenn die Sperre eine Zeichenfolge aus Nullen oder Leerzeichen ist, ist dies mit ziemlicher Sicherheit der Fall.)

jm.
quelle
103
Mein Problem hatte nichts mit Klonen oder BSODs zu tun, aber für mich habe ich die .hg / wlock-Datei gelöscht, um die Sperre aufzuheben.
Frank Hadder
32
hg recoversollte nach einer defekten Verriegelungssituation ausgeführt werden.
James Broadhead
9
Vielen Dank - nachdem ich .hg / wlock entfernt hatte, hatte ich keine Ahnung, was das Problem war
Andrew Buss
34
In meinem Fall (TortoiseHg V2.9.2 mit Mercurial 2.7.2) war der Dateiname "wlock" anstelle von "lock"; und es wurde im Verzeichnis ".hg" abgelegt, nicht im Verzeichnis ".hg / store".
Fernando
7
@Marmoute - Das Repository wird gesperrt, wenn eine Änderung vorgenommen wird. Wenn dieser Prozess durch etwas fehlschlägt, z. B. durch einen Fehler in Mercurial, einen Computerausfall usw., bleiben die Sperrdateien erhalten und werden nicht bereinigt. Ich glaube, die Vorschläge hier zum manuellen Löschen der Sperrdateien beziehen sich auf die Fälle, in denen das Repository irgendwie in einem "unreinen" Zustand belassen wurde. Es als "blindes Entfernen des Quecksilberschutzes" zu bezeichnen, ist keine faire oder genaue Charakterisierung dessen, was in diesen Fällen vor sich geht.
JoGusto
345

Wann waiting for lock on working directorylöschen .hg/wlock.

Tiago Matos
quelle
6
Dies war bei mir der Fall. Es war ein Symlink auf 'nix zum Strom server:pid. Vielen Dank. Dann musste ich laufen $ hg recover, um das vorhandene Journal (& Commit-Nachricht) zu löschen, das ich ctrl+cbearbeitet hatte. Ich $ hg recoverbin mir nicht sicher, aber Sie können möglicherweise ausgeführt werden, ohne die Sperrdatei zu löschen, und dies wird für Sie erledigt. Einen Versuch wert, nehme ich an.
Sholsinger
2
Nur ein Hinweis für @sholsinger, dass das Ausführen von hg recovery nur funktioniert, wenn Sie zuerst die Sperre entfernen. Ich versuchte es.
Dan
1
Das Repository wird aus einem bestimmten Grund gesperrt. Ein anderer Prozess arbeitet am Repo. Sie sollten diesen Prozess finden und beenden, anstatt den Quecksilberschutz blind zu entfernen. Das Löschen der Datei kann zu einer Beschädigung des Repositorys führen.
Marmoute
@Marmoute In meinem Fall musste ich die Sperre aufheben, da kein anderer Prozess am Repo arbeitete. Aber ich stimme zu, es lohnt sich, zuerst nach einem anderen Prozess zu suchen
Mi-La
Ich erhielt diese Nachricht plötzlich, als ich versuchte zu ziehen, nachdem ich einige Tage ohne Probleme gezogen und gedrückt hatte. Nach dem Löschen der Datei wurde das Problem behoben. Die Datei hatte eine Größe von 0 KB, was bedeutet, dass sie vermutlich leer war. Ist es in Ordnung, die Datei einfach zu löschen? Ich denke, es ist nützlich für den Schutz.
Ben Carp
47

Ich hatte dieses Problem ohne erkennbare Sperrdateien. Ich habe hier die Lösung gefunden: http://schooner.uwaterloo.ca/twiki/bin/view/MAG/HgLockError

Hier ist eine Abschrift von der Tortoise Hg Workbench-Konsole

% hg debuglocks
lock:  user None, process 7168, host HPv32 (114213199s)
wlock: free
[command returned code 1 Sat Jan 07 18:00:18 2017]
% hg debuglocks --force-lock
[command completed successfully Sat Jan 07 18:03:15 2017]
cmdserver: Process crashed
PaniniDev% hg debuglocks
% hg debuglocks
lock:  free
wlock: free
[command completed successfully Sat Jan 07 18:03:30 2017]

Danach lief der abgebrochene Zug erfolgreich.

Die Sperre wurde vor mehr als zwei Jahren durch einen Prozess auf einem Computer festgelegt, der sich nicht mehr im LAN befindet. Schade für die hg-Entwickler, dass a) Sperren nicht angemessen dokumentiert werden; b) keine Zeitstempel für die automatische Entfernung, wenn sie abgestanden sind.

Thomas Sharpless
quelle
23
Protip: Wenn wlockderjenige eingesperrt ist, verwenden Siehg debuglocks --force-wlock
Brad Turek
5
Ich habe Schildkröte hg seit mehr als 7 Jahren verwendet. Ich habe das Problem erst vor ungefähr 3 Monaten gesehen. Ich habe es in den letzten 3 Monaten 3 Mal gesehen. Einige Updates müssen das Problem verschlimmert haben.
d ei
20

Mitarbeiter hatten heute genau dieses Problem, nach einem BSoD beim Versuch zu pushen. Er musste:

Dann funktionierte sein Repo wieder.

BEARBEITEN: Gemäß dem Kommentar von @ Marmoute ist die Verwendung bei Problemen mit Sperren hg debuglockeine sicherere Alternative zum blinden Löschen der .hg/store/lockDatei.

Ian Kemp
quelle
2
1) Es gibt absolut keinen Grund, die Phaseroots-Datei zu berühren. Sie hat absolut nichts mit dem Sperren zu tun. 2) Das Entfernen des Schlosses durch Blindling ist eine schlechte Idee. Es gibt wahrscheinlich einen anderen Prozess, der es verwendet. Verwenden Sie hg Debuglock, um herauszufinden, was passiert, und beenden Sie den Prozess mit der Sperre
Marmoute
3
1) In Anbetracht dessen, dass das Problem durch Entfernen behoben wurde, müsste ich nicht zustimmen. 2) Wusste zu diesem Zeitpunkt nichts über hg debuglock (kann auch keine Dokumentation dazu finden), und da das System gerade von einem Neustart gestartet wurde, gab es offensichtlich nichts, was das Repository sperrte - daher war das Löschen der Sperrdatei angemessen.
Ian Kemp
12

Ich bin mit dem Sperrcode von Mercurial (ab 1.9.1) sehr vertraut. Der obige Rat ist gut, aber ich würde das hinzufügen:

  1. Ich habe dies in freier Wildbahn gesehen, aber selten und nur auf Windows-Computern.
  2. Das Löschen von Sperrdateien ist die einfachste Lösung, ABER Sie müssen sicherstellen, dass nichts anderes auf das Repository zugreift. (Wenn die Sperre eine Folge von Nullen ist, ist dies mit ziemlicher Sicherheit wahr).

(Für Neugierige: Ich konnte die Ursache dieses Problems noch nicht ermitteln, vermute jedoch, dass es sich entweder um eine ältere Version von Mercurial handelt, die auf das Repository zugreift, oder um ein Problem in Pythons Aufruf socket.gethostname () unter bestimmten Windows-Versionen.)

Brad O.
quelle
2
FWIW es ist mir gerade auf Ubuntu passiert. Ich habe das Repository zum ersten Mal seit mehreren Wochen verwendet, daher kann ich mich nicht erinnern, was es in diesem Zustand hätte belassen können.
Cosmologicon
7

Ich hatte das gleiche Problem unter Win 7. Die Lösung bestand darin, folgende Dateien zu entfernen:

  1. .hg / store / phaseroots
  2. .hg / wlock

Für .hg / store / lock gab es keine solche Datei.

Ivan Dulov
quelle
Willkommen bei Stackoverflow. Versuchen Sie, mehr Inhalt zum Beitrag
hinzuzufügen
5
1) Es gibt absolut keinen Grund, die Phaseroots-Datei zu berühren. Sie hat absolut nichts mit dem Sperren zu tun. 2) Das Entfernen des Schlosses durch Blindling ist eine schlechte Idee. Es gibt wahrscheinlich einen anderen Prozess, der es verwendet. Verwenden hg debuglockSie diese Option, um herauszufinden, was passiert, und beenden Sie den Vorgang, bei dem das Schloss gehalten wird.
Marmoute
6

Ich erwarte nicht, dass dies eine gewinnbringende Antwort ist, aber es ist eine ziemlich ungewöhnliche Situation. Erwähnung für den Fall, dass jemand anders als ich darauf stößt.

Heute habe ich das "Warten auf Sperre im Repository" für einen hg-Push-Befehl erhalten.

Als ich den Befehl hung hg beendet habe, konnte ich keine .hg / store / lock sehen

Als ich nach .hg / store / lock suchte, während der Befehl aufgehängt war, existierte er. Die Sperrdatei wurde jedoch gelöscht, als der Befehl hg beendet wurde.

Als ich zum Ziel des Pushs ging und hg pull ausführte, war das kein Problem.

Schließlich stellte ich fest, dass sich die Prozess-ID auf dem hg-Push war, dass die Wartemeldung jedes Mal geändert wurde. Es stellte sich heraus, dass der "hg push" hing und auf ein Schloss wartete, das von selbst gehalten wurde (oder möglicherweise auf einen Teilprozess, den ich nicht weiter untersucht habe).

Es stellt sich heraus, dass die beiden Arbeitsbereiche, nennen wir sie A und B, .hg-Bäume hatten, die von symlink gemeinsam genutzt wurden:

A/.hg --symlinked-to--> B/.hg

Dies ist NICHT gut mit Mercurial zu tun. Mercurial versteht das Konzept von zwei Arbeitsbereichen, die dasselbe Repository gemeinsam nutzen, nicht. Ich verstehe jedoch, wie jemand, der von einem anderen VCS zu Mercurial kommt, dies möchte (Perforce tut dies, obwohl es kein DVCS ist; das Bazaar DVCS kann dies Berichten zufolge). Ich bin überrascht, dass ein symlinked REP-ROOT / .hg überhaupt funktioniert, obwohl es bis auf diesen Push zu scheinen scheint.

Krazy Glew
quelle
Verfolgt hg nicht dirstate .hg/? Wenn Sie sagen, dass die Repositorys „funktionieren“, führt das Ausführen hg upin einem nicht dazu, dass der Dirstate im anderen nicht mehr synchron ist - oder unternimmt mercurial etwas Besonderes, um dies zu unterstützen?
Binki
1
Sie können die Freigabeerweiterung (im Lieferumfang von Core Mercurial enthalten) verwenden, um mehrere Arbeitsverzeichnisse aus einem einzigen Repository zu haben.
Marmoute
4

Ich hatte das gleiche Problem. Beim Versuch, ein Commit durchzuführen, wurde folgende Meldung angezeigt:

waiting for lock on working directory of <MyProject> held by '...'

hg debuglock zeigte dies:

lock:  free
wlock:  (66722s)

Also habe ich den folgenden Befehl ausgeführt, und das hat das Problem für mich behoben:

hg debuglocks -W

Verwenden von Win7 und TortoiseHg 4.8.7.

user10125940
quelle
2

Wenn das gesperrte Repo das Original war, kann ich mir das nicht vorstellen geändert um es zu klonen, sodass Sie nur daran gehindert wurden, es in der Mitte zu ändern und den Klon durcheinander zu bringen. Nach dem Entfernen des Schlosses sollte es in Ordnung sein.

Die neue geklonte Kopie (wenn es sich um einen lokalen Klon handelt) kann sich jedoch in einem fehlerhaften Zustand befinden. Sie sollten sie daher wegwerfen und neu starten. (Wenn es ein Remote-Klon wäre, würde ich hoffen, dass er fehlgeschlagen ist und die unvollständige Kopie bereits weggeworfen hat.)

Markpasc
quelle
2

Ich habe dieses Problem unter Mac OS X 10.7.5 und Mercurial 2.6.2 beim Push-Versuch festgestellt. Nach dem Upgrade auf Mercurial 3.2.1 wurde "Keine Änderungen gefunden" anstelle von "Warten auf Sperre des Repositorys" angezeigt. Ich fand heraus, dass der Standardpfad so eingestellt wurde, dass er auf dasselbe Repository verweist. Es ist also nicht verwunderlich, dass Mercurial verwirrt wird.

JWWalker
quelle
1
Ich fand heraus, dass der Standardpfad so eingestellt wurde, dass er auf dasselbe Repository verweist . Diese. Vielen Dank - ich habe Schleifen durchlaufen, um das Problem zu beseitigen, und die pathEinstellung war der Schuldige.
WoJ