我尝试将文件夹层次结构提交到Mercurial存储库中,该存储库包含文件,绝对路径长度超过255个字符(Windows最大路径长度)。
对于这些文件,我收到一条错误消息
系统无法找到指定的路径
我们使用TortoiseHG和Mercurial的Eclipse插件,两者都不起作用。
有人为此找到了解决方案吗? (我不想在我的HD上更改存储库的位置)
答案 0 :(得分:18)
存在旨在解决这个确切问题的扩展。它是:https://www.mercurial-scm.org/wiki/Win32LongFileNamesExtension
它使用\\?\样式名称来透明地处理长文件。
我是作者,让我知道它是否适合你。
答案 1 :(得分:7)
我刚刚安装了Aaron Cohen'扩展,因为他suggested。 它完全适用于我的TortoiseHG 2.6.1!谢谢,亚伦!
虽然,我想在这里添加一份详细的指南,因为我找不到一个......
(至少在这里我在Win7 x64上做了什么 - 我不确定这是最短的方式)
setx PYTHONPATH d:\Python27\Lib\site-packages\win32lfn\src;d:\Python27\Lib\site-packages\mercurial\
cd /D D:\Python27
python d:\Python27\Lib\site-packages\win32lfn\tests\testwin32lfn.py
[extensions]
win32lfn = d:\Python27\Lib\site-packages\win32lfn\src\win32lfn.py
答案 2 :(得分:2)
见https://www.mercurial-scm.org/wiki/Win32LongFileNamesExtension(Aaron通过mercurial-devel邮件列表指出它。)
另一种不改变repo路径的解决方法可能是通过目录连接点创建第二条路径。它可能有效,因为文件系统驱动程序(或者更确切地说是某些安装的过滤器)在非常低的级别上进行了重新分析,因此到那时已知完整(Unicode)路径,并且扩展到超过260个字符应该可以正常工作。试试看。您可以在Windows Vista或7上使用工具mklink
,在Windows 2000或更高版本上使用Sysinternals中的junction.exe
。对于mklink
,请确保创建一个交接点。我不确定解析机制对目录符号链接的作用是否相同(尽管我依旧记得它应该)。
如果您没有可用的Unicode版本程序,则限制为260个字符(包括驱动器号部分)。没有什么可以解决的。
但是,所有ANSI函数都是通过Unicode对应的函数实现的,因此您可以通过提供\\?\
前面的完整路径来获得幸运。这个可能有效,但可能不会,因为程序本身没有考虑MAX_PATH
(= 260)以外的任何内容。请作者编译Unicode版本并使用我提到的前缀。这将解决问题。
这是Win32子系统的限制。绝对路径长度限制大约为32,767个字符。大约是因为Windows的对象管理器可能会扩展它(对象命名空间中的符号链接等)。
答案 3 :(得分:2)
快速而肮脏的解决方案是映射网络驱动器。
对于路径c:\ some long path \ project folder
Map \\ localhost \ c $ \某些长路径\来驱动Z:\
cd z:\project folder
hg push
在迁移到较短路径之前,我们已成功将其用作临时解决方案。
上面的mercurial插件看起来不错,但不幸的是,有很多与路径相关的非mercurial错误超过255个字符。例如,VS2010在259个字符处发生故障是一个真正的软木塞!
答案 4 :(得分:0)
运行mercurial 4.4.1客户端的Windows 10系统
Aaron Cohen扩展工作我确实需要做一个小小的调整
根据mhaecki在此帖子中发表的评论:https://bitbucket.org/remleduff/win32lfn/issues/13/not-compatible-with-version-431
在win32lfn.py文件中我改变了:
from mercurial import util, osutil,cmdutil
from mercurial.i18n import _
到:
from mercurial import util, cmdutil
from mercurial.cext import osutil
from mercurial.i18n import _