我尝试将文件夹层次结构提交到 Mercurial 存储库中,其中包含绝对路径长度超过 255 个字符(Windows 最大路径长度)的文件。
对于这些文件,我收到一条错误消息说
该系统找不到指定的路径
我们使用 TortoiseHG 和 Mercurial 的 Eclipse 插件,两者都不起作用。
有没有人找到解决方案?(我不想更改存储库在我的 HD 上的位置)
我尝试将文件夹层次结构提交到 Mercurial 存储库中,其中包含绝对路径长度超过 255 个字符(Windows 最大路径长度)的文件。
对于这些文件,我收到一条错误消息说
该系统找不到指定的路径
我们使用 TortoiseHG 和 Mercurial 的 Eclipse 插件,两者都不起作用。
有没有人找到解决方案?(我不想更改存储库在我的 HD 上的位置)
存在一个旨在解决这个确切问题的扩展。它是: https ://www.mercurial-scm.org/wiki/Win32LongFileNamesExtension
它使用 \\?\ 样式名称来透明地处理长文件。
我是作者,如果它适合你,请告诉我。
正如他所建议的,我刚刚安装了Aaron Cohen的扩展程序。它与我的 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
请参阅https://www.mercurial-scm.org/wiki/Win32LongFileNamesExtension(Aaron通过 mercurial-devel 邮件列表指出它)。
另一种不更改存储库路径的解决方法可能是通过目录连接点创建第二个路径。它可能会起作用,因为文件系统驱动程序(或者更确切地说是某些已安装的过滤器)在非常低的级别完成了重新解析,因此到那时就知道完整(Unicode)路径并且扩展到超过 260 个字符应该可以正常工作。试试看。mklink
您可以在 Windows Vista 或 7 上使用该工具,junction.exe
在 Windows 2000 或更高版本上使用 Sysinternals。mklink
确保创建一个连接点。我不确定重新解析机制对于目录符号链接的工作方式是否相同(尽管我隐约记得它应该)。
如果您没有可用的 Unicode 版本的程序,则限制为 260 个字符(包括驱动器号部分)。没有什么可以解决的。
但是,所有 ANSI 函数都是通过对应的 Unicode 实现的,因此您可能会幸运地提供以\\?\
. 这可能有效,但可能不会,因为程序本身没有考虑超出MAX_PATH
(= 260) 的任何内容。请作者编译一个 Unicode 版本并使用我提到的前缀。这将解决问题。
这是 Win32 子系统的限制。绝对路径长度限制约为 32,767 个字符。大约是因为 Windows 的对象管理器可能会扩展它(对象命名空间中的符号链接等)。
快速而肮脏的解决方案是映射网络驱动器。
对于路径 c:\some long path\project 文件夹
将 \\localhost\c$\some long path\ 映射到驱动器 Z:\
cd z:\project folder
hg push
在迁移到更短的路径之前,我们成功地将其用作临时解决方案。
上面的 mercurial 插件看起来不错,但不幸的是,存在许多与大于 255 个字符的路径相关的 non-mercurial 错误。例如,恰好 259 个字符的 VS2010 失败是一个真正的软木塞!
运行 mercurial 4.4.1 客户端的 Windows 10 系统
亚伦科恩扩展将起作用我确实需要做一个小小的调整
基于 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 _