【问题标题】:Mercurial: Commit files with more than 255 characters path length (Windows)?Mercurial:提交路径长度超过 255 个字符的文件(Windows)?
【发布时间】:2012-06-01 00:16:02
【问题描述】:

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

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

系统找不到指定的路径

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

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

【问题讨论】:

  • 我认为这不会有什么不同,但是您是否尝试过在命令行上运行hg commit

标签: mercurial tortoisehg mercurialeclipse


【解决方案1】:

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

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

我是作者,如果它适合你,请告诉我。

【讨论】:

【解决方案2】:

我刚刚安装了Aaron Cohen'扩展,就像他suggested一样。 它与我的 TortoiseHG 2.6.1 完美搭配!谢谢,亚伦!

不过,我想在此处添加详细指南,因为我找不到...

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

1。 Download Mercurial-py

  • 注意所需的 Python 版本
  • 我已经下载了“Mercurial-2.4.2 (64-bit 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,以确保 env.变量现在已正确设置

8。下载win32lfn

9。做内部 win32lfn 测试

cd /D D:\Python27
python d:\Python27\Lib\site-packages\win32lfn\tests\testwin32lfn.py

10.创建存储库的备份。

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

11.将 win32lfn 添加到 hgrc

[extensions]
win32lfn = d:\Python27\Lib\site-packages\win32lfn\src\win32lfn.py
  • 您可以在存储库中的“.hg”文件夹中找到“hgrc”

12.测试一下!

【讨论】:

  • 只是一个注释,但我只是做了一个提交,消除了对 pywin32 的需求。
  • 这太长了!我只是将 py 文件放在我的 tortoisehg 目录中,并将扩展名添加到 mercurial.ini - 工作正常。
  • 你在开玩笑吗?下载.py文件,链接到mercurial.ini,就像11th步骤一样,你就完成了!
【解决方案3】:

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

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

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

cd z:\project folder
hg push

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

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

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

【讨论】:

    【解决方案4】:

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

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


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

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

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

    【讨论】:

    • 虽然您的回答在技术上是正确的,但恐怕它没有用——Mercurial 是一个 Python 程序,不能仅仅在“Unicode”版本中重新编译。该问题是 Mercurial 的一个已知问题,并且已在邮件列表中进行了讨论。目前没有好的解决方法。
    • 据我所知,实际上 Python 可以。但这仍然需要对部分 Python 程序进行一些注意,以使用 `\\?` 前缀。
    • @MartinGeisler:我添加了一个突然想到的潜在解决方法。但总而言之,我认为最好指出某些东西是否不起作用,而不是让 OP 对限制、它们在哪里以及为什么一无所知。
    • 您的回答内容丰富且正确 - 这不是一个实用的解决方案,因为 Mercurial 不使用 API 处理 NTFS 上的长文件名(我相信最多 32K 个字符)。它是discussed in April,并解释说 Windows Explorer 无法处理使用此 API 编写的文件。共识是 Mercurial 可以在 Windows 本身切换时切换。 (如果您对此有更多了解,请加入邮件列表的讨论,我只是观察讨论的 Linux 用户。)
    【解决方案5】:

    运行 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 _
    

    【讨论】:

      猜你喜欢
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      相关资源
      最近更新 更多