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.jpg
和Lebensstiltagebuch_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
设置为true
或false
。
[这是因为不同的变音符号编码吗?]
是的。 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.pRecoMPOseUNIcode
。1
1我个人的偏好一般是“全小写”,这样我的小指就不会厌倦按SHIFT键这么多。这也回避了如何将 ß 字符大写的问题。 ? 但是 Git 使用的是骆驼式,这是一种 Go 编程。
【讨论】:
以上是关于Git看到由于不同的变音符号编码而无法访问的文件的文件更改?的主要内容,如果未能解决你的问题,请参考以下文章
Azure 机器学习批处理请求返回带有 Unix 的格式错误的变音符号