Mercurial:提交路径长度超过255个字符的文件(Windows)?

问题描述 投票:13回答:5

我尝试将文件夹层次结构提交到Mercurial存储库中,该存储库包含文件,绝对路径长度超过255个字符(Windows最大路径长度)。

对于这些文件,我收到一条错误消息说

该系统找不到指定的路径

我们使用TortoiseHG和Mercurial的Eclipse插件,两者都不起作用。

有没有人为此找到解决方案? (我不想在我的HD上更改存储库的位置)

mercurial tortoisehg mercurialeclipse
5个回答
18
投票

存在旨在解决该确切问题的扩展。它是:https://www.mercurial-scm.org/wiki/Win32LongFileNamesExtension

它使用\\?\样式名称来透明地处理长文件。

我是作者,让我知道它是否适合你。


7
投票

我刚刚安装了Aaron Cohen的扩展名,因为他是suggested。它完全适用于我的TortoiseHG 2.6.1!谢谢,亚伦!

虽然,我想在这里添加详细的指南,因为我找不到一个......

(至少这是我在Win7 x64上所做的 - 我不确定这是最短的方式)

1. Download Mercurial-py

  • 请注意所需的Python版本
  • 我已经下载了“Mercurial-2.4.2(64位py2.7)”

2. Download Python

  • 确保您正在下载兼容版本。
  • 我使用了“Windows X86-64 MSI Installer(2.7.3)”链接

3.安装Python

  • 我把它安装到“D:\ Python27”

4. Download pywin32

  • 它是Win32LongFileNamesExtension所必需的。
  • 请注意pywin32文件名中的Python版本号。
  • 我用的是“pywin32-218.win32-py2.7.exe”

5.安装pywin32

  • 确保安装程序检测到正确的Python安装
  • 就我而言,它安装在“d:\ Python27 \ Lib \ site-packages \ pywin32_system32 \”中

6.安装Mercurial

  • 确保安装程序检测到正确的Python安装
  • 就我而言,它安装在“d:\ Python27 \ Lib \ site-packages \ mercurial \”中

7.设置PYTHONPATH环境变量

setx PYTHONPATH d:\Python27\Lib\site-packages\win32lfn\src;d:\Python27\Lib\site-packages\mercurial\
  • 使用此cli命令,或使用其他方法执行相同操作
  • 当然,您应该根据自己的需求调整路径
  • 在此之后重新启动你的cli,以确保环境。变量现在已正确设置

8.下载win32lfn

  • 检查qazxsw poi上的可用下载量
  • 如果还没有,只需将存储库从project's repository page克隆到“d:\ Python27 \ Lib \ site-packages \ win32lfn \”
  • 现在“win32lfn.pyc”应该在“d:\ Python27 \ Lib \ site-packages \ win32lfn \ src \”中

9.做interanal win32lfn测试

https://bitbucket.org/remleduff/win32lfn

10.创建存储库的备份。

  • 对我来说,一切都很好,但你永远不知道......

11.将win32lfn添加到hgrc

cd /D D:\Python27
python d:\Python27\Lib\site-packages\win32lfn\tests\testwin32lfn.py
  • 您可以在存储库中的“.hg”文件夹中找到“hgrc”

12.测试一下!


2
投票

快速而肮脏的解决方案是映射网络驱动器。

对于路径c:\ some long path \ project文件夹

映射\\ localhost \ c $ \一些长路径\来驱动Z:\

[extensions]
win32lfn = d:\Python27\Lib\site-packages\win32lfn\src\win32lfn.py

在迁移到较短路径之前,我们成功地将其用作临时解决方案。

上面的mercurial插件看起来不错,但不幸的是,有许多与大于255个字符的路径相关的非mercurial错误。例如,VS2010在259个字符处的故障是一个真正的软木塞!

cd z:\project folder hg push


2
投票

请参阅http://support.microsoft.com/kb/2516078(Aaron通过mercurial-devel邮件列表指出它)。

另一种不改变repo路径的解决方法可能是通过目录连接点创建第二条路径。它可能有效,因为文件系统驱动程序(或者更确切地说是某些安装的过滤器)在非常低的级别上进行了重新分析,因此到那时已知完整(Unicode)路径,并且扩展到超过260个字符应该可以正常工作。试试看。您可以在Windows Vista或7上使用工具https://www.mercurial-scm.org/wiki/Win32LongFileNamesExtension,在Windows 2000或更高版本上使用Sysinternals的mklink。对于junction.exe,请确保创建一个交接点。我不确定解析机制对目录符号链接的作用是否相同(尽管我依旧记得它应该)。


如果您没有可用的Unicode版本程序,则限制为260个字符(包括驱动器号部分)。没有什么可以解决它。

但是,所有ANSI函数都是通过Unicode对应的函数实现的,因此您可以通过提供mklink前面的完整路径来获得幸运。这可能有效,但可能不会,因为程序本身没有考虑\\?\(= 260)之外的任何事情。请作者编译Unicode版本并使用我提到的前缀。这将解决问题。

这是Win32子系统的限制。绝对路径长度限制大约为32,767个字符。大约是因为Windows的对象管理器可能会扩展它(对象命名空间中的符号链接等)。


0
投票

Windows 10系统运行mercurial 4.4.1客户端

Aaron Cohen扩展工作我确实需要做一个小小的调整

基于mhaecki在这个帖子上发表的评论:MAX_PATH

在win32lfn.py文件中我更改了:

https://bitbucket.org/remleduff/win32lfn/issues/13/not-compatible-with-version-431

至:

from mercurial import util, osutil,cmdutil
from mercurial.i18n import _
© www.soinside.com 2019 - 2024. All rights reserved.