Mercurialが「ロック待ち」で立ち往生


346

Mercurialリポジトリのクローンを作成しているときに、ウィンドウにブルースクリーンが表示されました。

再起動後、ほぼすべてのhgコマンドに対して次のメッセージが表示されます。

c:\ src \> hg commit
'\ x00 \ x00 \ x00 \ x00 \ x00 \によって保持されているリポジトリc:\ src \ McVrsServerのロックを待機しています
x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 '
中断されました!

Googleは役に立ちません。

任意のヒント?


3
うわー、コミット中にブルースクリーンも表示され、同じエラーが発生しました。うれしいのは私だけじゃない!
CBarr 2013年

回答:


489

「リポジトリのロックを待っている」ときに、リポジトリファイルを削除します.hg/wlock(またはにある可能性があります.hg/store/lock

ロックファイルを削除するときは、他にリポジトリにアクセスしていないことを確認する必要があります。(ロックがゼロまたはブランクのストリングである場合、これはほぼ確実に当てはまります)。


103
私の問題はクローンやBSODとは何の関係もありませんでしたが、私は.hg / wlockファイルを削除してロックをクリアしました。
フランクハダー2010

32
hg recover壊れたロック状態の後に実行する必要があります。
James Broadhead、2011

9
どうもありがとう-.hg / wlockを削除した後、私は問題が何であるかわからなかった
Andrew Buss

34
私の場合(TortoiseHg V2.9.2とMercurial 2.7.2)、ファイル名は「lock」ではなく「wlock」でした。そして、それは「.hg / store」ではなく「.hg」ディレクトリに置かれました。
フェルナンド

7
@Marmoute-変更が行われるたびにリポジトリがロックされます。Mercurialのバグ、マシンのダウンなど、何らかの原因でプロセスが失敗した場合、ロックファイルはそのまま残り、クリーンアップされません。ロックファイルを手動で削除するためのここでの提案は、リポジトリが何らかの形で「クリーンでない」状態のままになっているケースに対処することだと思います。それを「水銀保護を盲目的に取り除く」と呼ぶことは、これらのケースで何が起こっているかについての公平でも正確でもありません。
JoGusto

345

ときwaiting for lock on working directory、削除し.hg/wlockます。


6
これは私にとって事実でした。'nix to the current'のシンボリックリンクでしたserver:pid。本当にありがとう。それから私は実行$ hg recoverした既存のジャーナル(&コミットメッセージ)を片付けるために走らなければなりませんctrl+cでした。確かではありませんが$ hg recover、ロックファイルを削除せずに実行できる可能性があります。私が推測する価値がある。
sholsinger

2
最初にロックを解除しない限り、hg recoverを実行しても機能しないという@sholsingerへの注意書きです。私はそれを試してみました。
Dan

1
リポジトリが理由でロックされ、別のプロセスがリポジトリで作業しています。あなたはそのプロセスを見つけ、盲目的に水銀保護を取り除く代わりにそれを終了させるべきです。ファイルをドロップするだけで、リポジトリが破損する可能性があります。
Marmoute、2015年

@Marmoute私の場合、他のプロセスがリポジトリで機能していないため、ロックを削除する必要がありました。しかし、私は、最初に別のプロセスを探すために、それの価値が同意する
ミ・ラ

何日か引っ張って押してみたところ、引っ張ろうとすると突然このメッセージが表示されました。ファイルを削除した後、問題は解決しました。ファイルは0 KBでした。つまり、ファイルが空だったと思います。単純にファイルを削除してもよいですか?保護に役立つと思います。
ベン・カープ

47

検出可能なロックファイルがないため、この問題が発生しました。私はここで解決策を見つけました:http : //schooner.uwaterloo.ca/twiki/bin/view/MAG/HgLockError

これはTortoise Hg Workbenchコンソールからのトランスクリプトです

% 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]

この後、中止されたプルは正常に実行されました。

ロックは2年以上前に、LAN上にないマシン上のプロセスによって設定されていました。a)ロックを適切に文書化していないことに対するhg開発者の恥。b)古くなったときに自動的に削除するためにタイムスタンプを付けない。


23
Protip:wlockロックされている場合は、次を使用しますhg debuglocks --force-wlock
Brad Turek

5
私は7年以上、亀のhgを使用しています。約3か月前まで問題を見たことがありません。過去3か月間に3回見ました。更新によって問題が悪化した可能性があります。
d ei

20

同僚は、プッシュしようとしている間のBSoDの後で、この正確な問題を今日抱えていました。彼はしなければならなかった:

それから彼のレポは再び働いた。

編集: @Marmouteのコメントによる-ロック関連の問題を処理する場合hg debuglock.hg/store/lockファイルを盲目的に削除するより安全な方法はを使用することです。


2
1)絶対にphaserootsファイルを変更する必要はありません。ロックとは無関係です。2)ブロックを盲目的に削除することは悪い考えです、それを使用している別のプロセスがある可能性があります。hg debuglockを使用して、何が起こっているのかを把握し、ロックを保持しているプロセスを終了します
Marmoute

3
1)削除することで問題が解決したことを考えると、私は反対する必要があります。2)その時点でhg debuglockについて知らなかった(それに関するドキュメントも見つからなかった)。また、システムがリブートから起動したばかりなので、明らかにリポジトリをロックしていなかったため、ロックファイルの削除が適切でした。
Ian Kemp

12

Mercurialのロックコードに精通しています(1.9.1以降)。上記のアドバイスは良いですが、私はそれを追加します:

  1. 私はこれを実際に目にしたことがありますが、まれにWindowsマシンでのみ見られます。
  2. ロックファイルを削除するのが最も簡単な修正ですが、他にリポジトリにアクセスしていないことを確認する必要があります。(ロックがゼロのストリングである場合、これはほぼ確実に当てはまります)。

(奇妙なことに、私はまだこの問題の原因を把握できていませんが、古いバージョンのMercurialがリポジトリにアクセスしているか、特定のバージョンのWindowsでのPythonのsocket.gethostname()呼び出しの問題であると思われます。)


2
FWIWそれはちょうどUbuntuで起こった。数週間ぶりにリポジトリを使用したのは初めてだったので、その状態で何が残っていたのか覚えていません。
Cosmologicon

7

Win 7でも同じ問題が発生しました。解決策は次のファイルを削除することでした。

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

.hg / store / lockに関しては-そのようなファイルはありませんでした。


Stackoverflowへようこそ。投稿にさらにコンテンツを追加してみてください
NJInamdar

5
1)絶対にphaserootsファイルを変更する必要はありません。ロックとは無関係です。2)ブロックを盲目的に削除することは悪い考えです、それを使用している別のプロセスがある可能性があります。hg debuglock何が起こっているのかを理解し、ロックを保持しているプロセスを終了するために使用します。
Marmoute、2015年

6

これが勝者となるとは思いませんが、かなり珍しい状況です。私以外の誰かがそれに遭遇した場合に備えて言及します。

今日、hg pushコマンドで「リポジトリのロックを待機しています」が表示されました。

hung hgコマンドを強制終了すると、.hg / store / lockが表示されませんでした

コマンドがハングしているときに.hg / store / lockを探したところ、存在していました。しかし、hgコマンドが強制終了されたときにロックファイルが削除されました。

プッシュのターゲットに行ってhg pullを実行しても問題ありません。

最終的に、hg pushのプロセスIDがロック待機メッセージであり、毎回変更されることに気付きました。「hg push」は、それ自体が保持しているロックを待機してハングしていることがわかりました(またはサブプロセスである可能性があります。これ以上は調査しませんでした)。

2つのワークスペースをAとBと呼び、.hgツリーがsymlinkで共有されていることがわかります。

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

これは、Mercurialを使用するのは良いことではありません。Mercurialは、同じリポジトリを共有する2つのワークスペースの概念を理解していません。ただし、別のVCSからMercurialにアクセスする人がこれをどのように望んでいるかは理解しています(PerforceはDVCSではありませんが、Bazaar DVCSはそうできると報告しています)。シンボリックリンクされたREP-ROOT / .hgがまったく機能することには驚いていますが、このプッシュ以外のようです。


hgはdirstateを追跡しません.hg/か?リポジトリが「機能する」と言うときhg up、一方で実行していないと、もう一方のリポジトリで同期が取れなくなります。または、Mercurialはこれをサポートするために何か特別なことをしますか?
binki 2015年

1
共有拡張機能(Core Mercurialに付属)を使用して、単一のリポジトリから複数の作業ディレクトリを作成できます。
Marmoute、2015年

4

私も同じ問題を抱えていました。コミットしようとしたときに次のメッセージが表示されました。

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

hg debuglock これを示した:

lock:  free
wlock:  (66722s)

そこで、次のコマンドを実行すると、問題が解決しました。

hg debuglocks -W

Win7とTortoiseHg 4.8.7の使用。


2

ロックされたレポがオリジナルだった場合、それが変更されているとは思えませんしてクローンを作成したので、途中で変更してクローンをめちゃくちゃにするのを防ぐだけでした。ロックを外すと問題ないはずです。

ただし、新しいクローンコピー(ローカルクローンの場合)は、何らかの不正な状態にある可能性があるため、破棄して最初からやり直す必要があります。(それがリモートクローンだった場合、失敗して、すでに不完全なコピーが破棄されていると思います。)


2

Mac OS X 10.7.5とMercurial 2.6.2でプッシュしようとすると、この問題が発生しました。Mercurial 3.2.1にアップグレードした後、「リポジトリのロックを待つ」のではなく、「変更が見つかりません」というメッセージが表示されました。どういうわけかデフォルトのパスが同じリポジトリを指すように設定されているので、Mercurialが混乱するのはそれほど驚くことではありません。


1
デフォルトのパスが同じリポジトリを指すように設定されていることがわかりました。この。ありがとう、あなた-私は問題を取り除くためにループを通過しました、そしてpath設定は犯人のものでした。
WoJ 2016

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.