Mercurial bị mắc kẹt chờ đợi khóa khóa


346

Có một màn hình xanh trong các cửa sổ trong khi nhân bản một kho lưu trữ đồng bóng.

Sau khi khởi động lại, bây giờ tôi nhận được thông báo này cho hầu hết các lệnh hg:

c: \ src \> hg cam kết
chờ khóa trên kho lưu trữ c: \ src \ McVrsServer được giữ bởi '\ x00 \ x00 \ x00 \ x00 \ x00 \
x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 '
bị gián đoạn!

Google không giúp được gì.

Bất cứ lời khuyên?


3
Ồ, tôi cũng có một màn hình trong khi cam kết và gặp lỗi tương tự. Vui mừng tôi không phải là người duy nhất!
CBarr

3
Tôi đã đề xuất phản hồi tốt hơn về thông báo lỗi tại bz.selenic.com/show_orms.cgi?id=4752
Karl Richter

Câu trả lời:


489

Khi "chờ khóa trên kho lưu trữ", hãy xóa tệp kho lưu trữ: .hg/wlock(hoặc có thể trong .hg/store/lock)

Khi xóa tệp khóa, bạn phải đảm bảo không có gì khác đang truy cập vào kho lưu trữ. (Nếu khóa là một chuỗi số không hoặc trống, điều này gần như chắc chắn là đúng).


103
Vấn đề của tôi không liên quan gì đến việc nhân bản hoặc BSOD nhưng đối với tôi, tôi đã xóa tệp .hg / wlock để xóa khóa.
hadder thẳng thắn

32
hg recovernên được chạy sau một tình huống khóa bị hỏng.
James Broadhead

9
Rất cám ơn - sau khi xóa .hg / wlock, tôi không biết vấn đề là gì
Andrew Buss

34
Trong trường hợp của tôi (TortoiseHg V2.9.2 với Mercurial 2.7.2), tên tệp là "wlock" thay vì "lock"; và nó được đặt trong thư mục ".hg", không phải trong ".hg / store".
Fernando

7
@Marmoute - kho lưu trữ bị khóa bất cứ khi nào thay đổi sẽ được thực hiện. Nếu một cái gì đó khiến quá trình đó không thành công - tức là lỗi trong Mercurial, máy bị hỏng, v.v. - các tệp khóa vẫn còn, không được dọn sạch. Tôi tin rằng các đề xuất ở đây để xóa các tệp khóa theo cách thủ công là để giải quyết các trường hợp trong đó kho lưu trữ bị bỏ lại ở trạng thái "ô uế". Gọi nó là "loại bỏ bảo vệ đồng bóng một cách mù quáng" không phải là một đặc điểm công bằng và chính xác của những gì đang xảy ra trong những trường hợp này.
JoGusto

345

Khi nào waiting for lock on working directory, xóa .hg/wlock.


6
Đây là trường hợp đối với tôi. Đó là một liên kết tượng trưng cho 'nix đến hiện tại server:pid. Cảm ơn nhiều. Sau đó, tôi phải chạy $ hg recoverđi để xóa tạp chí hiện có (& thông điệp cam kết) mà tôi ctrl+cđã chỉnh sửa. Không chắc chắn, nhưng bạn có thể chạy $ hg recovermà không cần xóa lockfile và nó sẽ làm điều đó cho bạn. Đáng giá tôi bắn.
sholsinger

2
Chỉ cần một lưu ý cho @sholsinger để nói rằng chạy hg recovery không hoạt động trừ khi bạn gỡ khóa trước. Tôi đã thử nó.
Dan

1
Kho lưu trữ bị khóa vì một lý do, một quá trình khác đang làm việc trên repo. Bạn nên tìm quá trình đó và chấm dứt nó thay vì mù quáng loại bỏ bảo vệ đồng bóng. Chỉ cần thả tập tin có thể dẫn đến tham nhũng kho lưu trữ.
Marmoute

@Marmoute Trong trường hợp của tôi, tôi đã phải tháo khóa, vì không có quá trình nào khác hoạt động trên repo. Nhưng tôi đồng ý, đáng để tìm kiếm một quy trình khác trước
Mi-La

Tôi nhận được tin nhắn này đột ngột khi cố gắng kéo, sau khi kéo và đẩy trong vài ngày mà không gặp vấn đề gì. Sau khi xóa tập tin, vấn đề đã được giải quyết. Các tập tin là 0 KB có nghĩa là tôi đoán nó trống. Có ổn không khi chỉ cần xóa các tập tin? Tôi đoán nó hữu ích để bảo vệ.
Cá chép Ben

47

Tôi đã có vấn đề này với không có tập tin khóa có thể phát hiện. Tôi tìm thấy giải pháp ở đây: http://schooner.uwaterloo.ca/twiki/bin/view/MAG/HgLockError

Dưới đây là bảng điểm từ bảng điều khiển Rùa 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]

Sau đó, cái kéo bị hủy bỏ chạy thành công.

Khóa đã được thiết lập hơn 2 năm trước, bởi một quá trình trên một máy không còn trên mạng LAN. Xấu hổ về các nhà phát triển hg vì a) không ghi lại các khóa đầy đủ; b) không đánh dấu thời gian để loại bỏ tự động khi chúng bị cũ.


23
Protip: Nếu wlockcái bị khóa, hãy sử dụnghg debuglocks --force-wlock
Brad Turek

5
Tôi đã sử dụng rùa hg trong hơn 7 năm. Tôi chưa bao giờ thấy vấn đề cho đến khoảng 3 tháng trước. Tôi đã nhìn thấy nó 3 lần trong 3 tháng qua. Một số cập nhật phải làm trầm trọng thêm vấn đề.
d ei

20

Coworker đã có vấn đề chính xác này ngày hôm nay, sau khi BSoD trong khi cố gắng đẩy. Anh ấy đã phải:

Sau đó, repo của anh ấy làm việc một lần nữa.

EDIT: Theo nhận xét của @ Marmoute - khi xử lý các vấn đề liên quan đến khóa, sử dụng hg debuglocklà cách thay thế an toàn hơn để xóa .hg/store/locktệp một cách mù quáng .


2
1) Hoàn toàn không có lý do gì bạn nên chạm vào tệp phaseroots, nó hoàn toàn không liên quan đến việc khóa. 2) mù quáng loại bỏ khóa là một ý tưởng tồi, có thể có một quá trình khác sử dụng nó. sử dụng gỡ lỗi hg để tìm hiểu điều gì đang xảy ra và chấm dứt quá trình giữ khóa
Marmoute

3
1) Xem xét rằng loại bỏ nó đã khắc phục vấn đề, tôi phải không đồng ý. 2) Không biết về gỡ lỗi hg tại thời điểm đó (không thể tìm thấy bất kỳ tài liệu nào về nó) và vì hệ thống vừa mới khởi động lại, nên rõ ràng không có gì khóa kho lưu trữ - do đó xóa tệp khóa là phù hợp.
Ian Kemp

12

Tôi rất quen thuộc với mã khóa của Mercurial (kể từ 1.9.1). Lời khuyên ở trên là tốt, nhưng tôi muốn thêm rằng:

  1. Tôi đã thấy điều này trong tự nhiên, nhưng hiếm khi, và chỉ trên các máy Windows.
  2. Xóa các tệp khóa là cách khắc phục dễ dàng nhất, NHƯNG bạn phải đảm bảo không có gì khác đang truy cập vào kho lưu trữ. (Nếu khóa là một chuỗi số không, điều này gần như chắc chắn là đúng).

.


2
FWIW nó vừa xảy ra với tôi trên Ubuntu. Đây là lần đầu tiên tôi sử dụng kho lưu trữ trong vài tuần, vì vậy tôi không nhớ những gì có thể để nó ở trạng thái đó.
Cosmologicon

7

Tôi gặp vấn đề tương tự trên Win 7. Giải pháp là xóa các tệp sau:

  1. .hg / cửa hàng / phaseroots
  2. .hg / khóa

Đối với .hg / store / lock - không có tệp nào như vậy.


Chào mừng bạn đến với Stackoverflow. Cố gắng thêm nhiều nội dung vào bài đăng
NJInamdar

5
1) Hoàn toàn không có lý do gì bạn nên chạm vào tệp phaseroots, nó hoàn toàn không liên quan đến việc khóa. 2) mù quáng loại bỏ khóa là một ý tưởng tồi, có thể có một quá trình khác sử dụng nó. sử dụng hg debuglockđể tìm hiểu những gì nó đang xảy ra và chấm dứt quá trình giữ khóa.
Marmoute

6

Tôi không mong đợi đây sẽ là một câu trả lời chiến thắng, nhưng đó là một tình huống khá bất thường. Đề cập đến trong trường hợp ai đó không phải tôi chạy vào đó.

Hôm nay tôi nhận được "chờ khóa trên kho" trên lệnh hg đẩy.

Khi tôi giết lệnh hung hg, tôi không thể thấy .hg / store / lock

Khi tôi tìm kiếm .hg / store / lock trong khi lệnh được treo, nó đã tồn tại. Nhưng lockfile đã bị xóa khi lệnh hg bị giết.

Khi tôi đi đến mục tiêu đẩy và thực hiện hg pull, không có vấn đề gì.

Cuối cùng, tôi nhận ra rằng ID quá trình trên hg đẩy là thông báo chờ khóa đang thay đổi mỗi lần. Nó chỉ ra rằng "hg đẩy" đã treo chờ một khóa được giữ bởi chính nó (hoặc có thể là một quy trình con, tôi đã không điều tra thêm).

Hóa ra hai không gian làm việc, hãy gọi chúng là A và B, có các cây .hg được chia sẻ bởi symlink:

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

Đây KHÔNG phải là một điều tốt để làm với Mercurial. Mercurial không hiểu khái niệm hai không gian làm việc chia sẻ cùng một kho lưu trữ. Tuy nhiên, tôi hiểu rằng làm thế nào một người nào đó đến Mercurial từ một VCS khác có thể muốn điều này (Perforce, mặc dù không phải là DVCS; DVCS Bazaar có thể làm như vậy). Tôi ngạc nhiên khi một REP-ROOT / .hg được liên kết hoàn toàn hoạt động, mặc dù có vẻ như ngoại trừ việc đẩy này.


Không hg theo dõi khát trong .hg/? Khi bạn nói rằng các kho lưu trữ, hãy làm việc, không chạy hg uptrong một lần khiến cho sự khao khát không đồng bộ trong các trò chơi khác hoặc làm đồng bóng làm điều gì đó đặc biệt để hỗ trợ điều này?
binki

1
Bạn có thể sử dụng tiện ích mở rộng chia sẻ (được gửi cùng với Core Mercurial) để có nhiều thư mục làm việc từ một kho lưu trữ duy nhất.
Marmoute

4

Tôi đã từng gặp vấn đề tương tự. Nhận được thông báo sau khi tôi cố gắng cam kết:

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

hg debuglock cho thấy điều này:

lock:  free
wlock:  (66722s)

Vì vậy, tôi đã thực hiện lệnh sau và điều đó đã khắc phục vấn đề cho tôi:

hg debuglocks -W

Sử dụng Win7 và TortoiseHg 4.8.7.


2

Nếu repo bị khóa là bản gốc, tôi không thể tưởng tượng được nó đã sửa đổi nó để sao chép nó, vì vậy nó chỉ ngăn bạn thay đổi nó ở giữa và làm rối bản sao. Nó sẽ ổn sau khi tháo khóa.

Tuy nhiên, bản sao nhân bản mới (nếu là bản sao cục bộ) có thể ở bất kỳ trạng thái không đúng định dạng nào, vì vậy bạn nên vứt nó đi và bắt đầu lại. (Nếu đó là một bản sao từ xa, tôi sẽ hy vọng nó thất bại và đã ném ra bản sao chưa hoàn chỉnh.)


2

Tôi gặp phải sự cố này trên Mac OS X 10.7.5 và Mercurial 2.6.2 khi cố gắng đẩy. Sau khi nâng cấp lên Mercurial 3.2.1, tôi nhận được "không tìm thấy thay đổi" thay vì "chờ khóa trên kho". Tôi phát hiện ra rằng bằng cách nào đó, đường dẫn mặc định đã được đặt để trỏ đến cùng một kho lưu trữ, vì vậy không quá ngạc nhiên khi Mercurial sẽ bị nhầm lẫn.


1
Tôi phát hiện ra rằng bằng cách nào đó, đường dẫn mặc định đã được đặt để trỏ đến cùng một kho lưu trữ . Điều này. Cảm ơn, bạn - Tôi đã trải qua các vòng lặp để thoát khỏi vấn đề và paththiết lập là thủ phạm.
WoJ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.