bash - 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。
解决方案
在 macOS 上,所有文件名都以特定的 UTF-8 规范化编码。无法创建名称不是有效 UTF-8 的文件,例如仅包含 ASCII 字符和 0xF0 字节的文件名。
但是,在大多数 Unix 系统上,文件名被编码为任意字节序列,因此 Git 允许您使用任何非 NUL 字节序列来命名文件。过去有人将非 UTF-8 文件名放入您的存储库,现在无法签出该修订。
您根本无法在 macOS 上查看该版本。由于不区分大小写,Git 会很高兴地签出重叠的文件,但如果无法创建目录,它将不允许签出。如果您想检查它,您可以尝试使用 Linux VM 或 Docker 容器,或者您可以使用git archive
生成 tarball 并使用存档工具将您想要的部分提取到适当的目录中。您还可以在 Linux 系统上使用固定路径(使用git mv
)创建该修订的副本,然后在您的 Mac 上检查它。
推荐阅读
- xcode - 如何在 SwiftUI 中使用带有结构的 if 语句?
- javascript - 使用 styled-component 将数组渲染到行
- asp.net - ASP.NET_SessionId cookieSameSite 问题
- java - 如何在其成员函数kotlin中调用构造函数?
- cassandra - 如何建模账户逻辑?
- python - Python:请求 POST 方法未将文件上传到 Web 服务器
- r - 跨不同行和列的多个矩阵元素
- laravel - Laravel 7.2 Illuminate\Foundation\Http\FormRequest 中的奇怪行为
- javascript - puppeteer web 抓取条件 if 语句
- android - 即使在使用导航 2.2.1 后仍然有错误 no current navigation node