Git 克隆存储库在 Linux 客户端上成功,但在 Windows 客户端上失败,并出现 error: invalid path 错误。Windows 操作系统保留了一些文件名,因此文件名在 Linux 中可能合法,但在 Windows 中却不合法。

该错误将在 git clone/fetch 期间的最终签出期间出现。作为示例,我们尝试克隆包含 con.h 文件名的存储库。
$ git clone --progress --verbose ssh://git@mybb.com:7999/project/myrepo.git
Cloning into 'myrepo'...
remote: Enumerating objects: 825542, done.
remote: Counting objects: 100% (825542/825542), done.
remote: Compressing objects: 100% (239771/239771), done.
remote: Total 1414136 (delta 769602), reused 586108 (delta 585739), pack-reused 588594
Receiving objects: 100% (1414136/1414136), 13.91 GiB | 22.80 MiB/s, done.
Resolving deltas: 100% (1132339/1132339), done.
error: invalid path 'path/to/broken/file/con.h'
fatal: unable to checkout working tree
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry with 'git restore --source=HEAD :/'
路径似乎没什么问题。问题是文件的基本名称是 con Windows 中的保留名称。
Windows 保留了某些文件名,因此尝试创建使用保留基本名称的文件将会失败。
请参阅 命名文件( docs.microsoft /en-us/windows/win32/fileio/naming-a-file) Windows 文档:
请勿使用以下保留名称作为文件名称:
CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8 和 LPT9。还应避免在这些名称后紧跟扩展名;例如,不建议使用 NUL.txt。
虽然这可以解决这个问题,但应该小心,因为 Windows 客户端的默认设置为 core.protectNTFS=true 关闭潜在的安全问题 CVE-2019-1353 ,如下 所述( github /git/git/commit/9102f958ee5254b10c0be72672aa3305bf4f4704) 。
根据文件名,配置 Git 以忽略 NTFS 命名可能会解决该问题。
git config --global core.protectNTFS false
关闭后, protectNTFS Git 将不再抱怨那些具有保留基本名称的文件,但如果文件名是保留名称之一,则不会阻止错误。
唯一的解决方法是在源存储库或通过非 Windows 客户端重命名任何有问题的文件。
core.protectNTFS 实际上配置这个参数会忽略有问题的文件,最终的文件大小可能为 0,请谨慎使用!!!

