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



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

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

系统找不到指定的路径

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

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

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

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

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

正如他所建议的那样,我刚刚安装了Aaron Cohen的扩展。它与我的 龟HG 2.6.1 完美配合!谢谢,亚伦!

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

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

1. 下载汞

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

2. 下载蟒蛇

  • 确保您正在下载兼容版本。
  • 我使用了"Windows X86-64 MSI 安装程序 (2.7.3)"链接

3. 安装蟒蛇

  • 我已将其安装到"D:\Python27"

4. 下载 pywin32

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

5. 安装 pywin32

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

6. 安装汞

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

7. 设置 PYTHONPATH 环境变量

setx PYTHONPATH d:Python27Libsite-packageswin32lfnsrc;d:Python27Libsite-packagesmercurial
  • 使用此 cli 命令,或使用其他方法执行相同的操作
  • 当然,您应该根据自己的需求调整路径
  • 在此之后重新启动您的 cli,以确保现在正确设置了 env. 变量

8. 下载win32lfn

  • 在项目的存储库页面上检查可用的下载
  • 如果仍然没有,只需将存储库从 https://bitbucket.org/remleduff/win32lfn 克隆到"d:\Python27\Lib\site-packages\win32lfn\"
  • 现在"win32lfn.pyc"应该在"d:\Python27\Lib\site-packages\win32lfn\src\"中

9. 做肛间win32lfn测试

cd /D D:Python27
python d:Python27Libsite-packageswin32lfnteststestwin32lfn.py

10. 创建存储库的备份。

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

11. 将 win32lfn 添加到 hgrc

[extensions]
win32lfn = d:Python27Libsite-packageswin32lfnsrcwin32lfn.py
  • 您可以在存储库内的".hg"文件夹中找到"hgrc"

12. 测试一下!

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

对于路径 c:\some 长路径\项目文件夹

将 \\

localhost\c$\some long path\ 映射到驱动器 Z:\

cd z:project folder
hg push

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

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

http://support.microsoft.com/kb/2516078

参见 https://www.mercurial-scm.org/wiki/Win32LongFileNamesExtension(Aaron通过mercurial-devel邮件列表指出它)。

在不更改存储库路径的情况下,另一种解决方法可能是通过目录联接点创建指向存储库的第二条路径。它可能会起作用,因为重新解析是由文件系统驱动程序(或者更确切地说是一些已安装的过滤器)在非常低的级别完成的,因此到那时已经知道完整(Unicode)路径,并且扩展到超过 260 个字符应该可以正常工作。试一试。您可以使用 Windows Vista 上的工具mklink或 Windows 2000 或更高版本上的 Sysinternals 的 7 和 junction.exe。对于mklink请确保创建一个交接点。我不确定重新解析机制对目录符号链接的工作方式相同(尽管我隐约记得它应该)。


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

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

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

运行

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 _

最新更新