检出git分支时文件名中的非法字节序列

时间:2019-01-10 10:10:48

标签: bash git macos

我在cli中使用git来更改当前分支:

git checkout dev
它产生:
  

致命:无法在'app / src / androidTest / java?com'下创建目录:非法字节序列

作为回答in this questionthis one,我尝试了:

LC_ALL=C git checkout dev

LC_CTYPE=C git checkout dev
但我收到了与上述相同的错误。

运行:

git status

显示checkout更改了某些文件,但是我仍然在master分支上。

如何删除导致问题的文件,或者如何在不出现此错误的情况下检出分支?

2 个答案:

答案 0 :(得分:1)

语言环境仅影响事物的显示方式。如果文件名包含文件系统不允许的字符,则没有任何语言环境调整可以解决该问题。

我想不出一种强制文件系统让您创建随后无法使用的文件的方法,或者是希望能够这样做的充分理由。

作为一种解决方法,可能是使用准系统Linux创建虚拟主机,该Linux系统的格式设置为允许使用旧式8位文件名(Latin-1或CP1252,如果您可以使用那种讨厌的Windows风格),请检查删除文件,重命名并将重命名提交回git。重命名之前,您仍然无法签出源代码树的版本。

答案 1 :(得分:1)

我在各种github项目中发现了一些与一个或另一个操作系统不兼容的文件。例如,带有“ .nul”或“ .con”扩展名的文件在Windows上确实很麻烦。这不是git独有的问题。例如,如果Subversion由于本地命名原因而无法还原文件,则会令人讨厌地终止。

在某些情况下,文件可能已错误上传。如果您自己的项目属于这种情况,则应该可以使用git工具列出存档并从存档中删除文件,而无需实际在本地实例化文件。

在其他情况下,该特定文件可能不重要,并且可以忽略。如果缺少测试,也许测试会失败?

我使用的一个技巧是通过手动创建目录路径来阻止包含该文件的整个文件夹同步,但是对于最后一个元素,请创建一个空文件而不是文件夹。当然,现在整个测试套件都会失败。

当版本控制尝试执行检出操作时,它将仅无法还原文件夹,而不会给出致命错误。

当然,这仅在文件夹不重要时才有效,例如一些测试文件。

另一种方法是将问题文件以外的所有文件零序检出,但这可能是一个乏味的检出序列。但是您可以使用此攻击来还原使用上述技术省略的其余文件夹。或者,如果文件不是关键文件,则从zip下载中本地拖动文件。