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

时间:2012-05-25 11:55:55

标签: mercurial tortoisehg mercurialeclipse

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

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

  

系统无法找到指定的路径

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

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

5 个答案:

答案 0 :(得分:18)

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

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

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

答案 1 :(得分: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安装程序(2.7.3)"链路

3。安装Python

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

4。 Download pywin32

  • Win32LongFileNamesExtension需要它。
  • 请注意pywin32&#filename中的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

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

9。做interanal 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
  • 你可以找到" hgrc"在你的" .hg"文件夹,在您的存储库中

12。测试一下!

答案 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个字符处发生故障是一个真正的软木塞!

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

答案 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 _