Git看到由于不同的变音符号编码而无法访问的文件的文件更改?

Posted

技术标签:

【中文标题】Git看到由于不同的变音符号编码而无法访问的文件的文件更改?【英文标题】:Git seeing file changes on files that I can't access because of differing umlaut-encodings? 【发布时间】:2021-12-11 20:04:50 【问题描述】:

我的 git 目前有一个大问题。我有一个克隆的 git 存储库,它正在跟踪行为非常奇怪的文件。

这完全是关于两个文件,称为Lebensstiltagebuch_Frühstück_1.jpgLebensstiltagebuch_Frühstück_2.jpg

Git 总是告诉我,它们已经改变了,我应​​该先清理我的工作树,然后才能拉出新的东西。但无论我做什么,这两个文件都保留在Changes not staged for commit: 列表中:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   "Lebensstiltagebuch_Fru\314\210hstu\314\210ck_1.jpg"
    modified:   "Lebensstiltagebuch_Fru\314\210hstu\314\210ck_2.jpg"

我已经尝试过:

git reset --hard HEAD,丢弃所有未跟踪的更改,但它什么也没做 git rm --cached Lebensstiltagebuch_Frühstück_2.jpg

但没有任何效果。 我还尝试从文件夹中删除现有文件,然后列表如下所示:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    deleted:    "Lebensstiltagebuch_Fr\303\274hst\303\274ck_1.jpg"
    deleted:    "Lebensstiltagebuch_Fr\303\274hst\303\274ck_2.jpg"

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   "Lebensstiltagebuch_Fru\314\210hstu\314\210ck_1.jpg"
    modified:   "Lebensstiltagebuch_Fru\314\210hstu\314\210ck_2.jpg"

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    "Lebensstiltagebuch_Fr\303\274hst\303\274ck_1.jpg"
    "Lebensstiltagebuch_Fr\303\274hst\303\274ck_2.jpg"

在这里我可以看到我正在处理的文件在解码时具有不同的文件名 (?),然后 end 是 \274ck_2.jpg vs \210ck_2.jpg

虽然我一直在处理同一个文件,并且在 finder 中以及在终端中运行 ls -la 时,文件名完全相同,但使用 ü,ö,ä,因为我是德国人...

我正在开发 macOS 12 Beta。有人知道如何解决这个问题吗?

【问题讨论】:

\303\274ü Latin Small Letter U With Diaeresis 的 UTF-8 字节序列的八进制表示,而 u\314\210 与 decomposed u 类似拉丁文小写字母 U 后跟 ̈ 组合分音符号。我不知道git 中的这种mojibake 案例... 【参考方案1】:

TL;DR:尝试将core.precomposeUnicode 设置为truefalse

[这是因为不同的变音符号编码吗?]

是的。 JosefZ has pinpointed it: \303\274 是用变音符号编码小写 U 的一种方法(Go 将其称为单个“符文”),u\314\210 是另一种用变音符号编码小写 U 的不同方法(两个独立的“符文”,Go 会这么称呼它们)。

根本问题在于,在 Linux 系统上,您可以使用任何一种拼写——组合式,如第一种情况,或解组合式,如第二种情况——但 macOS 坚持只使用一种拼写: 分解的形式。 (大多数 Linux 软件倾向于使用组合形式,但操作系统不会坚持一种方式。事实上,您可以存储两个 不同 文件,其名称为 看起来相同,但一个文件以一种方式拼写,而另一个文件以另一种方式拼写。)

实际存储库包含存储库所具有的任何内容。 .gitignore.gitattributes 文件拥有它们所拥有的一切。但是文件在文件系统中,在你的工作树中,在macOS上会用分解的形式拼写。操作系统坚持。你不能让它表现得不一样。此处只能有一个显示字符为ü的文件名,使用分解后的形式。

二进制文件中是否有任何更改 - 首先可能会或可能不会将其视为二进制文件,具体取决于 .gitattributes 设置,可能不匹配文件在您的 macOS 工作树中作为文件 存储的方式——以及您是否真正更改文件的名称和/或内容在 Git 中 当您使用 git add 时,它们是单独的问题,每个问题都有自己单独的答案。

Git 有一个特定于 macOS 的旋钮:

core.precomposeUnicode

您可以使用git config 将此选项设置为true 以告诉Git“撤消”分解并使用组合形式存储在Git 索引中的文件名。 (我假设但尚未测试,这也适用于.gitattributes,如果/必要的话。)

问题是,这应该已经设置为true。如果是这样,您可以将其设置为 false。如果 Linux 系统正在使用分解的文件名,这就是您需要做的。

有关这方面的更多信息,请参阅https://www.git-tower.com/help/guides/faq-and-tips/faq/unicode-filenames/mac(其中更详细并提供了一些方法来在您同时使用 Linux 和 macOS 时自行测试)。注意这个页面拼写旋钮core.precomposeunicode(全小写),但是Git config设置中的字母大小写无关,所以你可以拼写coRE.pRecoMPOseUNIcode1


1我个人的偏好一般是“全小写”,这样我的小指就不会厌倦按SHIFT键这么多。这也回避了如何将 ß 字符大写的问题。 ? 但是 Git 使用的是骆驼式,这是一种 Go 编程。

【讨论】:

以上是关于Git看到由于不同的变音符号编码而无法访问的文件的文件更改?的主要内容,如果未能解决你的问题,请参考以下文章

Azure 机器学习批处理请求返回带有 Unix 的格式错误的变音符号

Microsoft Excel 破坏 .csv 文件中的变音符号?

替换python中的变音符号

美国布局的变音符号和其他符号的替代键盘映射

现代信用卡处理系统是不是允许在持卡人姓名中使用变音符号?

UTF-8 解码变音符号偶尔会失败