“Mercurial Stick”;“等待锁定”;
克隆mercurial存储库时在windows中出现蓝屏 重新启动后,我现在收到几乎所有hg命令的以下消息: c:\src\>hg commit waiting for lock on repository c:\src\McVrsServer held by '\x00\x00\x00\x00\x00\ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' interrupted! c:\src\>hg提交 正在等待由“\x00\x00\x00\x00\x00\x00\x00\x00\x00”持有的存储库c:\src\McVrsServer上的锁定\ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 打断! 谷歌帮不了什么忙 任何提示?当“等待锁定存储库”时,删除存储库文件:“Mercurial Stick”;“等待锁定”;,mercurial,Mercurial,克隆mercurial存储库时在windows中出现蓝屏 重新启动后,我现在收到几乎所有hg命令的以下消息: c:\src\>hg commit waiting for lock on repository c:\src\McVrsServer held by '\x00\x00\x00\x00\x00\ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' interrupted! c:\src\>hg提交 正在等待由“\x0
.hg/wlock
(或者它可能位于.hg/store/lock
)
删除锁定文件时,必须确保没有其他内容正在访问存储库。(如果锁是一个零或空白字符串,这几乎是肯定的)。 < P>如果锁定的回购是原来的,我无法想象它正在修改它来克隆它,所以它只会阻止你在中间改变它,扰乱克隆。拆下锁后应该没问题
但是,新克隆的副本(如果是本地克隆)可能处于任何形式的错误状态,因此您应该将其丢弃并重新启动。(如果它是一个远程克隆,我希望它失败并且已经抛出了不完整的副本。)当等待锁定工作目录时,删除.hg/wlock我非常熟悉Mercurial的锁定代码(从1.9.1开始)。上述建议很好,但我要补充一点:
我在野外见过这种情况,但很少,而且只在Windows机器上见过
删除锁定文件是最简单的修复方法,但您必须确保没有其他东西正在访问存储库。(如果锁是一串零,这几乎肯定是正确的)
(出于好奇:我还没有找到这个问题的原因,但怀疑可能是Mercurial的旧版本访问存储库,或者是Python的socket.gethostname()调用在某些版本的Windows上出现了问题。)如果它只发生在映射驱动器上,则可能是错误。使用UNC路径而不是驱动器号似乎可以避免这个问题。今天,一位同事在尝试推送时遇到了BSoD问题。他必须:
- 删除文件
.hg/store/lock
(根据)
- 删除文件
.hg/store/phaseroots
(根据)
然后他的回购协议又起了作用
编辑:根据@Marmoute的评论-在处理锁相关问题时,使用hg debuglock
比盲目删除.hg/store/lock
文件更安全。我不认为这是一个成功的答案,但这是一个相当不寻常的情况。
以防我以外的人碰到它
今天,我在一个hgpush命令中得到了“等待锁定存储库”
当我关闭hung-hg命令时,我看不到.hg/store/lock
当我在命令挂起时查找.hg/store/lock时,它是存在的。但是当hg命令被终止时,锁文件被删除
当我到达推的目标并执行hg pull时,没有问题
最终我意识到hg push上的进程ID是lock waiting消息,每次都在更改。事实证明,“hg push”挂起等待自己持有的锁(或者可能是子流程,我没有进一步研究)
事实证明,这两个工作区(我们称之为A和B)有symlink共享的.hg树:
A/.hg --symlinked-to--> B/.hg
这对Mercurial来说不是一件好事。Mercurial不理解两个工作区共享同一存储库的概念。然而,我确实理解,从另一家风投公司来到Mercurial的人可能会希望这样(Perforce这样做,尽管不是DVCS;据说Bazaar DVCS可以这样做)。我感到惊讶的是,一个符号链接的REP-ROOT/.hg居然可以工作,尽管它似乎除了这个推送之外。我在Mac OS X 10.7.5和Mercurial 2.6.2上尝试推送时遇到了这个问题。升级到Mercurial 3.2.1后,我得到的是“未发现任何更改”,而不是“等待存储库锁定”。我发现默认路径被设置为指向同一个存储库,所以Mercurial会感到困惑也就不足为奇了。我在Win7上也遇到了同样的问题。
解决方案是删除以下文件:
.hg/存储/相区
.hg/wlock
至于.hg/store/lock——没有这样的文件。我遇到了这个问题,因为没有可检测的锁文件。我在这里找到了解决方案:
这是来自Tortoise Hg工作台控制台的一份转录本
% 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]
在此之后,中止的拉动成功运行
锁是在两年多前由一台不再在局域网上的机器上的进程设置的。为hg开发人员感到羞耻,因为a)没有充分记录锁;b) 没有在它们过时时自动删除它们的时间戳。我也有同样的问题。我尝试提交时收到以下消息:
waiting for lock on working directory of <MyProject> held by '...'
因此,我执行了以下命令,解决了我的问题:
hg debuglocks -W
使用Win7和OrtoiseHG 4.8.7。我的问题与克隆或BSOD无关,但对我来说,我删除了.hg/wlock文件以清除锁。hg recover
应该在锁断后运行。非常感谢-删除.hg/wlock后,我不知道我的问题是什么(带有Mercurial 2.7.2的OrtoiseHG V2.9.2),文件名为“wlock”而不是“lock”;它被放在“.hg”目录中,而不是“.hg/store”。@Marmoute——每当要进行更改时,存储库就会被锁定。如果某件事情导致该进程失败——例如,Mercurial中的一个bug、一台机器出现故障等等——锁文件将保留,而不是清理。我相信这里手动删除锁文件的建议是为了解决存储库不知何故处于“不干净”状态的情况。称之为“盲目消除汞保护”并不是对这些案件的公正和准确描述,我就是这样认为的。它是nix上指向当前服务器的符号链接:pid
。谢谢
hg debuglocks -W