Windows版Git中的文件名太长


663

我在用着 Git-1.9.0-preview20140217 Windows。据我所知,此版本应解决文件名过长的问题。但是不适合我。

当然,我做错了什么:我没有git config core.longpaths truegit add .git commit。一切顺利。但是,当我现在执行a时git status,会得到带有的文件列表Filename too long,例如:

node_modules/grunt-contrib-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js: Filename too long

对我来说,复制非常简单:只需使用Angular生成器(“ yo angular”)创建Yeoman Web应用程序并将其node_modules.gitignore文件中删除即可。然后重复上述Git命令。

我在这里想念什么?


您在哪里读到那个版本应该修复长文件名?
iveqy 2014年

这是该补丁的请求请求:github.com/msysgit/git/pull/122
Papa Mufflon

@PapaMufflon您可以将接受的答案更改为得分更高的答案吗?它对我帮助很大。
v.karbovnichy

@ v.karbovnichy请仔细阅读我的问题。我已经在投票最高的答案中运行了该命令。但是在我问这个问题时,被接受的答案是正确的:msys仍然具有此字符限制。现在这个限制已经消失了,git config core.longpaths true可以正常工作了。
爸爸Mufflon

好吧,我同意了
v.karbovnichy

Answers:


701

Git的文件名限制为4096个字符,但在Windows上使用msys编译Git时除外。它使用Windows API的旧版本,文件名限制为260个字符。

据我了解,这是msys的限制,而不是Git的限制。您可以在此处阅读详细信息:https : //github.com/msysgit/git/pull/110

您可以通过使用Windows上的Git的另一个客户端或组绕过这一core.longpathstrue在其他的答案解释。

git config --system core.longpaths true

Git是脚本和编译后代码的组合。通过上述更改,某些脚本可能会失败。这就是默认情况下不启用core.longpaths的原因。

https://docs.microsoft.com/zh-cn/windows/desktop/fileio/naming-a-file上的Windows文档提供了更多信息:

从Windows 10版本1607开始,MAX_PATH限制已从常见的Win32文件和目录功能中删除。但是,您必须选择加入新行为。

注册表项允许您启用或禁用新的长路径行为。若要启用长路径行为,请将注册表项设置为HKLM \ SYSTEM \ CurrentControlSet \ Control \ FileSystem LongPathsEnabled(类型:REG_DWORD)


19
路径中的260个字符的限制并非特定于MSYS,它是Windows API的通用模仿。可以使用Unicode路径解决此问题,但这还有其他缺点,这就是core.longpaths默认情况下未启用的原因。另请注意,Git for Windows并未针对MSYS进行编译。取而代之的是,它是带有精简MSYS环境的本机Windows应用程序。
sschuberth,2015年

3
@sschuberth:除了与不支持长路径的程序缺乏兼容性之外,还有其他缺点吗?
2015年

3
@JAB的另一个缺点是长路径始终必须是绝对路径;不支持相对路径。有关更多详细信息,请参见此处
sschuberth's

4
或作为快速解决方案,只需尝试在Windows上将回购签到C:/即可,从而减少文件夹路径字符的数量。
Akshay Lokur

5
仅供参考,到现在,问题仍然存在。我们可能要考虑一个真正的操作系统上持续发展...
盖佐Török

1033

您应该能够运行命令

git config --system core.longpaths true

或在受支持的Git版本上手动将其添加到您的Git配置文件之一中,以启用此功能。看起来可能是1.9.0及更高版本。


13
这个配置选项为我解决了这个问题,即使使用msys,如已接受的答案中所述。(特别是版本1.9.4.msysgit.2)。
Alex Osborn 2014年

5
除非您“还确保SourceTree使用系统的Git而不是嵌入式的Git,否则Sourcetree的行为有点奇怪”。-感谢马捷Drolc该建议
bstoney

38
以下是一些背景信息,为什么默认情况下不启用此功能,以及一些技术细节。
sschuberth,2015年

12
运行上面的命令后,得到“无法锁定配置文件C:\ Program Files \ Git \ mingw64 / etc / gitconfig”。但是@Yash的答案对我
有用

10
@divideByZero以管理员身份运行git bash可以防止该错误。
尼克(Niek)

204

这可能会有所帮助:

git config core.longpaths true

基本说明:此答案建议不要将此设置应用于全局系统(对所有项目都避免--system--global标记)配置。此命令仅通过特定于当前项目来解决问题。


13
此处的人们已经注意到,此设置可能会引入一些不可预测的行为,因此,似乎最好将上述命令用作需要它的项目的本地设置,而不是将--system其应用于所有项目的附加设置
Grant Humphries,2016年

4
嘿,这只是其他备受推崇的答案的复制品。威力至少是解释为什么你喜欢拆卸--system选项..
费利克斯·加侬-格尼尔

78

创建.gitconfig并添加

[core]
longpaths = true

您可以在项目位置(不确定)和全局位置中创建文件。就我而言,位置是C:\Users\{name}\


10
您也可以使用以下命令来执行此操作:git config --global core.longpaths true
Curly

git config --global core.longpaths true对我有用,谢谢
Rama Krshna Ila

1
使用Visual Studio时,上面的git bash解决方案对我不起作用,但是为项目找到.git / config文件并按上面所示进行编辑就可以了。谢谢你。
安德鲁·帕特

这对我
有用

1
上面提到并验证的答案是正确的,但是具有授予该文件的权限,可能无法使用这些命令更新文件。这种方法真的很容易,因为这是手动方法,对我来说效果很好。您可以.gitconfig在以下路径中轻松找到文件,C:\Users\{username}然后对其进行编辑。
卡文杜·那拉索塔

53

遵循的步骤:

  1. 管理员身份运行Git Bash
  2. 运行以下命令:
git config --system core.longpaths true

注意:如果步骤2不起作用或出现任何错误,您也可以尝试运行以下命令:

git config --global core.longpaths true

git config 在此处了解更多信息。


35

更好的解决方案是启用Git中的longpath参数。

git config --system core.longpaths true

但是一种可行的解决方法是从Git中删除node_modules文件夹:

$ git rm -r --cached node_modules
$ vi .gitignore

在.gitignore文件内的新行中添加node_modules。完成此操作后,请推送您的修改:

$ git add .gitignore
$ git commit -m "node_modules removed"
$ git push

3
有充分的理由将node_modules文件夹检入git中:如果您希望软件在npm可能消失了一年的模块之后表现出相同的行为。
cfstras

@cfstras如果某个库有漏洞并且您没有定期更新,那么肯定会遇到安全问题。
詹德森席尔瓦

1
当然,您必须升级您的依赖项。但是,只有在想要的时候,并且如果有什么要打破的,您才需要在git中备份...
cfstras 2016年

是真的。我将编辑anwser。谢谢您的评论。
詹德森席尔瓦

1
无需提交node_modules:该packages.lock文件位于此处,以确保安装的版本npm install始终相同,直到您完成npm update
Pierre-Olivier Vares 19-10-17

32

为了完全确保它在初始化存储库之后但在获取远程历史记录或签出任何文件之前立即生效,以这种方式使用它更安全:

git clone -c core.longpaths=true <repo-url>

-c键=值

在新创建的存储库中设置配置变量;这将在初始化存储库之后,但在获取远程历史记录或签出任何文件之前立即生效。密钥的格式与git-config 1预期的格式相同(例如,core.eol = true)。如果为同一个键指定了多个值,则每个值都将写入配置文件。例如,这可以安全地将其他提取refspec添加到原始远程服务器。

更多信息


24

执行git config --system core.longpaths true抛出一个错误给我:

“错误:无法锁定配置文件C:\ Program Files(x86)\ Git \ mingw32 / etc / gitconfig:权限被拒绝”

在全局级别执行命令已修复:

git config --global core.longpaths true

全局设置仅影响当前用户,而系统设置影响计算机上的所有用户。如果这是您的工作站,那么它们实际上与您只能使用一个用户的身份相同。
毛巾

4
如果您是命令行应用程序Ran以管理员身份运行,则第一个命令将起作用!
Sachith Dickwella

12

您也可以尝试启用长文件路径。

如果运行Windows 10家庭版,则可以更改注册表以启用长路径。

转到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemregedit,然后设置LongPathsEnabled1

如果您使用Windows 10 Pro或Enterprise,则还可以使用本地组策略。

转到“ 计算机配置” →“ 管理模板” →“ 系统” →“ 文件系统gpedit.msc,打开“ 启用Win32长路径”并将其设置为“ 启用”


5
我相信这必须与git config结合使用,并且值得注意的是,由于此处提到的原因,它不适用于Windows资源管理器。
Neo

11
git config --global core.longpaths true

上面的命令对我有用。使用'--system'给我配置文件未锁定错误


2
对于Github Desktop用户,这是唯一可行的,因为Github Desktop使用自己的Git配置。
卡萨巴

4

将存储库移至驱动器的根目录(临时修复程序)

您可以尝试将本地存储库(整个文件夹)临时移动到驱动器的根目录或尽可能靠近根目录的位置。

由于路径在驱动器的根部较小,因此有时可以解决问题。

在Windows上,我将其移至C:\另一个驱动器的根目录。


2
这是解决我问题的唯一方法。就是我的路径中有太多文件夹。
J Brune '18

2

我也有此错误,但我的原因是使用了过时的npm v1.4.28版本。

更新到npm v3,然后更新

rm -rf node_modules
npm -i

为我工作。npm问题2697包含npm v3(2015-06-25发布)中包含的“最大平坦”文件夹结构的详细信息。


1

如果使用加密分区,请考虑将文件夹移动到未加密分区,例如/ tmp,正在运行git pull,然后再移回。


0

在Windows机器中

以管理员身份运行命令提示符,然后在命令下方运行

git config --system core.longpaths是

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.