github/git Checkout Returns 'error: invalid path' on Windows

当我试图从 github 签出一个存储库时,我得到了一个错误:

error: invalid path 'configs/perl-modules/DIST.64/perl-HTML-Tree-1:5.03-1.el6.noarch.rpm'

我怀疑问题在于路径包含了一个: ,这在 Windows 上是非法的。

在研究了这个错误之后,我找到了两个可能的答案:
1)更改存储库文件的路径。不幸的是,这是一个团队资源,在可预见的将来是无法修复的。
2)使用稀疏校验。 我尝试过这种方法,但是没有效果,如下所示:

$git -n git@github.com: XXXXXX/loy.git
克隆成“部署”..。
Remote: 枚举对象: 57,完成。
Remote: 计数对象: 100% (57/57) ,完成。
Remote: 压缩对象: 100% (49/49) ,完成。
Remote: 总计86457(delta 10)、重用22(delta 8)、包重用86400
接收对象: 100% (86457/86457) ,1.50 GiB | 4.73 MiB/s,完成。
解析 delta: 100% (59779/59779) ,完成。
$cd 部署/
$git config core. Sparseccheck out true
$echo www > . git/info/Sparse-checkout
$git checkout centos6
Error: 无效路径‘ configs/perl-module/DIST.64/perl-HTML-Tree-1:5.03-1. el6.noarch.rpm’
Error: 无效路径‘ configs/perlbrew/perls/perl-5.24.1/man/man3/App: : Cpan.3’
.
. (repeat for many files)

这是用 Git for Windows“ Git version 2.28.0完成的。窗户,一寸。我还尝试了两种类型的行结束和使用各种版本的。Git/info/Sparse-checkout 类似于:

/*
!/configs/perl-modules
!/configs/perlbrew/perls/perl-5.24.1/man/man3

Checkout 在 Linux、 MacOS 和 WSL 上运行良好,唯一的问题是我的 IDE 不能在那里工作。为什么稀疏检出不能在 Windows 上工作。还有其他可能性吗?

127780 次浏览

我怀疑问题是路径包含[冒号字符] :,这在 Windows 上是非法的。

这就是问题所在。

[sparse checkout with] !configs/perlbrew/perls/perl-5.24.1/man/man3

被抱怨的路径名是:

configs/perl-modules/DIST.64/perl-HTML-Tree-1:5.03-1.el6.noarch.rpm

它不以 configs/perlbrew/开始,更不用说完整的可跳过路径了。

您可以通过(痛苦地)枚举所有无效的文件名来解决这个问题。不过,Git 需要一个更好的通用机制。

After I opened an issue on the git-for-windows bug tracker (https://github.com/git-for-windows/git/issues/2803), I found that my issue had already been filed as https://github.com/git-for-windows/git/issues/2777. That issue suggested that I need to set another git flag:

git config core.protectNTFS false

这(# 2777)确实包含了一个我的问题旁路。我希望 git 或者 git-for-windows (响应性很强)能够提供一个更好的警告消息,或者像文件路径映射方案这样的真正修复。

请注意,这只是在窗口中使用稀疏签出时才会出现的问题。

I have been like you , your filename is incorrect or not reserved , just rename your file

如果没有其他解决方案可用,那么问题可能就出在 git 的版本上。 我使用的版本 2.31.1和错误显示,但后来我尝试与 2.15和它的工作正常。 But for me the error was with the git clone command.

在我们的示例中,有一个文件名 aux.go,而 windows 不允许创建包含单词 aux的文件

enter image description here

Read more about this issue 给你

对于那些有类似错误的人:
就个人而言,问题在于在 Linux 上以文件名使用 ",而在 Windows10机器上尝试使用 pull

对于那些只想通过命令来解决这个问题的人:

git clone --sparse -c core.protectNTFS=false -n <repo-URL>
git sparse-checkout add "\!<pattern1>" "\!<pattern2>"
git checkout <branch>

模式是相对于回收根,可以使用 *

如果使用不同的操作系统,例如 linux vs Windows 或 Mac OS vs Windows。检查文件路径中的字符。在我的情况下,我保存的项目在我的 Mac 和提交,当拉在我的 Windows 机器,文件路径错误发生。

Windows states that

文件名不能包含以下任何字符:/: * ?”< > |

但我保存的图像名称中包含“ *”。因此,只要提交对您的团队使用的不同操作系统有效的新名称即可。或者通过寻找变通方法使自己更加沮丧

简单的权利。

我曾经遇到过类似的问题,试图在 Windows 上从 GitHub 签出一个包含名称中带有“ :”的文件的存储库。(导致问题的示例文件名: “ Test-img. jpg: Zone. Identifier”)。回购文件下载了,但文件没有显示在文件夹中。

我发现运行 git config core.protectNTFS false解决了我的问题,但只有在运行之前和之后采取了一些步骤。整个过程是这样的:

  1. 在本地克隆 Git 存储库;
  2. “ cd”到刚刚被克隆的本地 Git 存储库文件夹;
  3. 运行 git reset
  4. 运行 git config core.protectNTFS false
  5. 运行 git checkout(只是 git checkout,no * 在命令结束时)。

之后,我就能看到文件了。当然,从 Git 下载的一些额外的东西通常会被省略,但在我的例子中并不是什么大问题。

在我的例子中,文件名在末尾有一个额外的空间,这在 Windows 上造成了一个问题。

I was able to fix this issue by removing this space. As I was not able to clone the project on Windows, this change has been done directly on where our repository was (which is GitHub in our case).

在使用 git clone之前

执行以下命令:

git config --global core.protectNTFS false

在我的例子中,回购包含在 Windows 中包含无效字符的文件,如 []

我发现了一个没有提到的选项。使用 WSL签出文件。

我在 WSL/Bash 中运行 git clone,而不是 PowerShell/CMD。WSL 透明地处理修复文件名,即使它们仍然存储在 NTFS 上,我使用 VS Code for Windows 打开它们。我能够修改 Windows 中的文件,甚至在 Windows 上推动我的更改。

附录-git 版本2.34.1. windows. 1及其他(?)

遗憾的是,git config core.protectNTFS false证明是不够的;。

解决方案

DR

git diff ec28c8ddd5f8c83d11604bcae69afb46d79b1029 > p.patch
patch -R -f -i p.patch
git add *
git commit

详细说明

事实证明 git config core.protectNTFS false确实有效,至少在 不再在 git checkout上产生致命的错误方面。

但是,git 现在将为冒号和 零内容生成文件名 被剪了

例如: Writing-Bops:-The-Bebop-Schema-Language.md(? 9KB)-> Writing-Bops(0KB)

为了解决这个问题,我们需要以另一种方式获得原始违规文件内容的副本,这样我们就可以恢复它。

条件/假设

  • 这里假设由于某种原因 不能不会使用 稀疏克隆。
  • 同样的 git apply-filter和其他技术“永久重写”git 历史,例如当你跟踪第三方 git 回购。
  • You're running Windows, using NTFS storage, git-for-windows with bash as your shell and have a patch.exe available (patch --version should report something like "GNU patch 2.7.6")

(在我们的例子中,我们在处理 github wiki 克隆时遇到了包含冒号的文件名问题。当然,我们希望在合适的地方解决这个问题,而不是额外的“稀疏克隆”或 WSL 英里。)

事实证明我们可以在找到之后找到缺失的内容

git config core.protectNTFS false
git checkout <hash>

by running patch. (BTW: TortoiseGit would 永远吊着 if you tried to diff/compare these commits!)

使用下面的命令获取包含所有缺少的更改的补丁文件。如果您有多个文件冒号或其他麻烦,所有缺少的内容将在补丁文件中列出: 一个补丁文件捕捉它的一切!

git diff ec28c8ddd5f8c83d11604bcae69afb46d79b1029 > p.patch
# ^^^^ reference the git hash with the offending original file(s)

Now that you have a patchfile, you can apply it to the current 工作目录: it must be applied 倒车 (-R):

patch -R -f -i p.patch

如果你忘记了 -R,补丁程序会问(回答 [y]es) ; 如果你 指定 -R补丁程序会叫得更厉害,所以 -f(力量)是为了关闭补丁程序,只是做这项工作。

这里应该列出一个或多个因此被修补的文件,例如。

$ patch -R -f -i p.patch
patching file Writing-Bops:-The-Bebop-Schema-Language.md

请注意文件名 中的冒号: 原来 Windows 上的 GNU 补丁(至少 v2.7.6)在文件名中使用了一个 < em > Unicode 同形字 simulate的冒号。请参见下文。

现在,在 工作目录中已经有了冒号文件的原始内容,现在可以将这些文件添加到 git 索引中,并像往常一样提交它们:

警告: 在继续之前,您可能需要清除(删除)由您的早期 git checkout产生的空的 被剪了文件名!

注意: 如果您不喜欢分配给缺少内容的同形文字的文件名 patch -i,那么您可以在提交结果之前将其更改为您喜欢的任何内容。

git add *
git commit

确认结果

When you did everything right, that last commit should list the colon-ed file as 重新命名 as you did not change the content and git commit should thus have detected the "file rename action" as-is.

额外: 用 象形文字代替冒号

I 发现了几个 Unicode 同形文字看起来或多或少像冒号,但在 NTFS 文件名中被认为是 合法的

经过一些实验,我决定使用 ,因为我想保持 我一直在摆弄的 github 维基页面尽可能完整。

一般来说,我会完全丢弃冒号,或者用一个或多个连字符替换它,但是在 wiki MarkDown 页面的情况下,这个决定可能会走向另一个方向。

一旦我为 git 命令提供了一个目标路径,它就停止查找 c:/program files/git/src 这种做法失败了: Git log —— pretty = email —— patch-with-stat —— return —— full-index —— binary ——/src/pathtofile

这种方法是有效的: Git log —— pretty = email —— patch-with-stat —— return —— full-index —— bin —— ./src/pathtofile

你可能需要检查一下文件命名。Windows 不允许在文件名的末尾使用某些字符,例如“ ?”“ ,”: “。删除/重命名它们,然后再试一次。 PS: spaces aren't allowed either.

GitHub中: 转到 RepoURL (https://github.com/UserNameHere/RepoNameHere) ,然后单击“ Code”> “ DownloadZIP”,然后解压缩。在 Windows 中的 zip 文件对我来说是成功的(我必须跳过无效的文件)

enter image description here

enter image description here