Git 签出因“非法字节序列”而失败

Ron*_*adi 2 git macos bash

我正在尝试将源代码回滚到 git 上的旧版本。

$ git checkout -f c258d300c8e85d68eeb15763eb14a059a2984f6d
fatal: cannot create directory at 'client-common/src/test/java/com/adi?caas': Illegal byte sequence
Run Code Online (Sandbox Code Playgroud)

以上adi?caas就是问题的原因。

git diff --name-only c258d300c8e85d68eeb15763eb14a059a2984f6d~ c258d300c8e85d68eeb15763eb14a059a2984f6d
client-common/src/test/java/com/adi<F0>caas/client/common/utils/MockConfigurationFileBuilder.java
Run Code Online (Sandbox Code Playgroud)

这也可能是非标准字符adi<F0>cass。我该如何克服这个问题?有没有办法自动将这个字符映射到/. 因为那是应该的,我确实有client-common/src/test/java/com/adi/caas/

我使用的是 mac OSX Mojave 10.14.6 和 git 版本 2.16.2。

bk2*_*204 5

在 macOS 上,所有文件名均以特定的 UTF-8 规范化进行编码。无法创建名称不是有效 UTF-8 的文件,例如仅包含 ASCII 字符和 0xF0 字节的文件名。

然而,在大多数 Unix 系统上,文件名被编码为任意字节序列,因此 Git 允许您使用任意非 NUL 字节序列来命名文件。过去有人将非 UTF-8 文件名放入您的存储库中,但现在无法检出该修订版本。

您根本无法在 macOS 上查看该修订版。Git 会很乐意检查由于不区分大小写而重叠的文件,但如果无法创建目录,则不允许检查。如果您想查看的话,可以尝试使用 Linux VM 或 Docker 容器,或者您可以使用它git archive来生成 tarball 并使用存档工具将所需的片段提取到适当的目录中。您还可以在 Linux 系统上使用固定路径(使用 )创建该修订版本的副本git mv,然后在 Mac 上查看它。