首页 > 解决方案 > Git 签出失败,出现“非法字节序列”

问题描述

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

$ git checkout -f c258d300c8e85d68eeb15763eb14a059a2984f6d
fatal: cannot create directory at 'client-common/src/test/java/com/adi?caas': Illegal byte sequence

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

git diff --name-only c258d300c8e85d68eeb15763eb14a059a2984f6d~ c258d300c8e85d68eeb15763eb14a059a2984f6d
client-common/src/test/java/com/adi<F0>caas/client/common/utils/MockConfigurationFileBuilder.java

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

我正在使用 mac OSX Mojave 10.14.6 和 git 版本 2.16.2。

标签: bashgitmacos

解决方案


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

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

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


推荐阅读