Mercurial застряг "чекаючи блокування"


346

Отримав bluescreen у Windows під час клонування сховища.

Після перезавантаження я отримую це повідомлення майже для всіх команд hg:

c: \ src \> hg фіксувати
в очікуванні блокування в сховищі c: \ src \ McVrsServer, утримуваний '\ x00 \ x00 \ x00 \ x00 \ x00 \
x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 '
перервано!

Google не допомагає.

Якісь поради?


3
Нічого собі, у мене також був bluescreen під час вчинення, і я отримав таку ж помилку. Радий, що я не єдиний!
CBarr

3
Я запропонував кращі відгуки про повідомлення про помилку на bz.selenic.com/show_bug.cgi?id=4752
Карл Ріхтер

Відповіді:


489

Коли "чекаєте блокування в сховищі", видаліть файл сховища: .hg/wlock(або він може бути в .hg/store/lock)

Видаляючи файл блокування, ви повинні переконатися, що більше нічого не має доступу до сховища. (Якщо замок - це рядок нулів або порожній, це майже напевно вірно).


103
Моя проблема не мала нічого спільного з клонуванням або BSOD, але для мене я видалив .hg / wlock файл, щоб очистити замок.
відвертий гаддер

32
hg recoverслід запускати після розбитої ситуації блокування.
Джеймс Броудхед

9
Велике спасибі - після вилучення .hg / wlock я не мав уявлення, у чому проблема
Ендрю Бус

34
У моєму випадку (TortoiseHg V2.9.2 з Mercurial 2.7.2) назва файлу була "wlock" замість "lock"; і він був розміщений у каталозі ".hg", а не в ".hg / store".
Фернандо

7
@Marmoute - сховище заблокується кожного разу, коли будуть внесені зміни. Якщо щось спричиняє збій цього процесу - наприклад, помилка в Mercurial, машина, що виходить з ладу тощо - файли блокування залишаються, а не очищаються. Я вважаю, що пропозиції щодо видалення файлів блокування вручну полягають у тому, щоб вирішити ті випадки, коли сховище було якось залишено у "нечистому" стані. Називати це "сліпою видаленням захисного заходу" не є справедливою, ані точною характеристикою того, що відбувається в цих випадках.
ДжоГусто

345

Коли waiting for lock on working directory, видаліть .hg/wlock.


6
Так було для мене. Це було символьне посилання на 'nix до течії server:pid. Дякую купу. Тоді мені довелося бігти, $ hg recoverщоб очистити існуючий журнал (& повідомлення про введення), який я ctrl+cредагував. Не впевнений, але ви, можливо, зможете запустити, $ hg recoverне видаляючи файл блокування, і це зробить це за вас. Варто пострілу, я думаю.
sholsinger

2
Просто примітка до @sholsinger, яка говорить про те, що запущене відновлення hg не працює, якщо спочатку не зняти блокування. Я спробував це.
День

1
Сховище заблокується з причини, інший процес працює над репо. Ви повинні знайти цей процес і припинити його замість того, щоб сліпо знімати захисний захист. Просто видалення файлу може призвести до пошкодження сховища.
Мармут

@Marmoute У моєму випадку мені довелося зняти замок, оскільки жоден інший процес не працював над репо. Але я згоден, варто спочатку шукати інший процес
Mi-La

Я отримав це повідомлення раптово, коли намагався витягнути, після тягнення та натискання на кілька днів без проблем. Після видалення файлу проблема була вирішена. Файл був 0 Кб, що означає, що я думаю, він був порожнім. Добре просто видалити файл? Я думаю, це корисно для захисту.
Бен Карп

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 років тому процесом на машині, якої більше немає в локальній мережі. Ганьба розробникам hg за: а) недостатнє документальне оформлення блокувань; б) не маркувати їх для автоматичного вилучення, коли вони застаріли.


23
Порада: якщо wlockзаблоковано, використовуйтеhg debuglocks --force-wlock
Бред Турек

5
Я використовував черепаху hg протягом 7+ років. Я ніколи не бачив проблеми приблизно до 3 місяців тому. Я бачив це 3 рази за останні 3 місяці. Деякі оновлення, можливо, посилили проблему.
d ei

20

Цю точну проблему у колеги було сьогодні, після BSoD, намагаючись просунути Він повинен був:

Потім його репо знову працювали.

EDIT: Відповідно до коментаря @ Marmoute - при вирішенні проблем, пов’язаних із замком, використання hg debuglockбезпечнішої альтернативи сліпому видаленню .hg/store/lockфайлу.


2
1) Абсолютно немає причин, щоб ви торкалися файлу фараотів, він абсолютно не пов'язаний із блокуванням. 2) зняття заслінки - це погана ідея, ймовірно, ще один процес її використання. використовуйте hg debuglock, щоб з'ясувати, що відбувається, і завершити процес, що тримає замок
Marmoute

3
1) Враховуючи те, що усунення усунуло проблему, я повинен був би не погодитися. 2) В той час не знав про hg debuglock (не можу знайти жодної документації на нього), і оскільки система щойно вийшла з перезавантаження, очевидно нічого не блокувало сховище - значить, видалення файлу блокування було доречним.
Ян Кемп,

12

Мені дуже знайомий код блокування Mercurial (станом на 1.9.1). Наведена вище порада хороша, але я додам, що:

  1. Я бачив це в дикій природі, але рідко, і лише на машинах Windows.
  2. Видалити файли блокування - це найпростіше виправлення, АЛЕ ви повинні переконатися, що більше нічого не має доступу до сховища. (Якщо замок - це рядок нулів, це майже напевно вірно).

(Для допитливих: я ще не зміг знайти причину цієї проблеми, але підозрюю, що це або старіша версія Mercurial, що отримує доступ до сховища, або проблема у виклику sotk.gethostname () Python у певних версіях Windows.)


2
FWIW це просто трапилося зі мною на Ubuntu. Вперше я використовував сховище за кілька тижнів, тому я не пам'ятаю, що могло б залишити його в такому стані.
Cosmologicon

7

У мене була така ж проблема з Win 7. Рішенням було видалити такі файли:

  1. .hg / store / faroroots
  2. .hg / wlock

Щодо .hg / store / lock - такого файлу не було.


Ласкаво просимо до Stackoverflow. Спробуйте додати більше вмісту до публікації
NJInamdar,

5
1) Абсолютно немає причин, щоб ви торкалися файлу фараотів, він абсолютно не пов'язаний із блокуванням. 2) зняття заслінки - це погана ідея, ймовірно, ще один процес її використання. використовувати hg debuglockдля з'ясування того, що відбувається, і завершити процес, утримуючи замок.
Мармут

6

Я не очікую, що це буде виграшною відповіддю, але це досить незвична ситуація. Згадування у випадку, якщо хтось, крім мене, натрапив на нього.

Сьогодні я отримав команду "hg push" "очікування блокування в сховищі".

Коли я вбив команду висів hg, я не міг побачити .hg / store / lock

Коли я шукав .hg / store / lock, поки команда висіла, вона існувала. Але lockfile було видалено, коли команда hg була вбита.

Коли я пішов до цілі поштовху, і здійснив тяг hg, жодних проблем.

Врешті-решт я зрозумів, що ідентифікатор процесу на hg push був блокуванням очікування повідомлення, що змінюється щоразу. Виявляється, "hg push" висів у очікуванні замка, який тримав сам (або, можливо, підпроцес, я далі не досліджував).

Виявляється, у двох робочих просторах, назвемо їх А і В, дерева .hg були спільними по символьному посиланню:

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

З Меркуріалом це НЕ хороша справа. Mercurial не розуміє концепцію двох робочих просторів, що діляться одним сховищем. Я розумію, однак, як хтось, хто приходить до Меркуріалу з іншого VCS, може цього захотіти (Perforce робить, хоча це не DVCS; базарний DVCS може це зробити). Я здивований, що синхронізований REP-ROOT / .hg працює взагалі, хоча, здається, крім цього натиску.


Чи не hg відслідковує дрістати .hg/? Коли ви говорите, що сховища «працюють», не працює hg upв одному, не виводить із системи синхронізацію в інший - чи робить mercurial щось особливе, щоб підтримати це?
бінкі

1
Ви можете використовувати розширення для спільного доступу (поєднане з Core Mercurial), щоб мати кілька робочих каталогів з одного сховища.
Мармут

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.