Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git与ä混淆;在文件名中_Git_Macos_Filesystems - Fatal编程技术网

Git与ä混淆;在文件名中

Git与ä混淆;在文件名中,git,macos,filesystems,Git,Macos,Filesystems,我处于一个糟糕的git环境中,因为文件名带有一个ä。这是一个可能已经存在多年的旧文件: 因此,它用\303\244标记为未跟踪,但如果我删除它,它会被标记为已删除,但用\314\210标记。非常混乱。我真的不在乎这个文件,但我想知道将来 ~/d/p/uniply ❯❯❯ git status master ◼ On branch master You

我处于一个糟糕的git环境中,因为文件名带有一个ä。这是一个可能已经存在多年的旧文件:

因此,它用\303\244标记为未跟踪,但如果我删除它,它会被标记为已删除,但用\314\210标记。非常混乱。我真的不在乎这个文件,但我想知道将来

~/d/p/uniply ❯❯❯ git status                                                                           master ◼
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        "deployment/ec2/Prods\303\244ttning"

nothing added to commit but untracked files present (use "git add" to track)
~/d/p/uniply ❯❯❯ rm deployment/ec2/Prodsättning                                                       master ◼
~/d/p/uniply ❯❯❯ git status                                                                           master ✖
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    "deployment/ec2/Prodsa\314\210ttning"

no changes added to commit (use "git add" and/or "git commit -a")
~/d/p/uniply ❯❯❯ git checkout -- deployment/ec2                                                       master ✖
~/d/p/uniply ❯❯❯ git status                                                                           master ◼
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        "deployment/ec2/Prods\303\244ttning"

nothing added to commit but untracked files present (use "git add" to track)
~/d/p/uniply❯❯❯ git状态主机◼
论分行行长
您的分支机构是最新的“原始/主”分支机构。
未跟踪的文件:
(使用“git add…”包含在将提交的内容中)
“部署/ec2/Prods\303\244ttning”
提交时未添加任何内容,但存在未跟踪的文件(使用“git add”跟踪)
~/d/p/uniply❯❯❯ rm部署/ec2/Prodsättning主机◼
~/d/p/uniply❯❯❯ git状态主机✖
论分行行长
您的分支机构是最新的“原始/主”分支机构。
未为提交而暂存的更改:
(使用“git add/rm…”更新将提交的内容)
(使用“git签出--…”放弃工作目录中的更改)
已删除:“部署/ec2/Prodsa\314\210ttning”
未向提交添加任何更改(使用“git add”和/或“git commit-a”)
~/d/p/uniply❯❯❯ git签出--部署/ec2主机✖
~/d/p/uniply❯❯❯ git状态主机◼
论分行行长
您的分支机构是最新的“原始/主”分支机构。
未跟踪的文件:
(使用“git add…”包含在将提交的内容中)
“部署/ec2/Prods\303\244ttning”
提交时未添加任何内容,但存在未跟踪的文件(使用“git add”跟踪)

简短版本:很明显,您使用的是Mac,它将所有文件名转换为NFD,而git过去盲目地将文件名视为字节,但现在在Mac上将文件名转换为NFC,以便更好地与其他系统兼容。因此,提交中的旧路径的行为将异常

$ python3
>>> import unicodedata
>>> unicodedata.normalize('NFC', b'a\314\210'.decode()).encode()
b'\xc3\xa4'
>>> unicodedata.normalize('NFD', b'\303\244'.decode()).encode()
b'a\xcc\x88'
这些格式的全称是规范化形式D(规范化分解)和规范化形式C(规范化分解,然后是规范化组合),它们在中定义

类似的情况也可能发生在不区分大小写的文件系统上-尝试在Windows或Mac上检查Linux内核树除此之外,您可能会发现一些回购协议同时包含
Makefile
Makefile
,但没有一个头脑正常的人会签入名为
a\314\210
\303\244
的文件,至少不是故意的

核心问题是,操作系统使同一个文件以不同的名称显示,因此git会根据它要查找的内容(如果它要查找的内容不是操作系统显示的默认名称)看到不同的内容

以下是这条道路在今天的表现,从新开始:

$ git init 
Initialized empty Git repository
$ git config --get core.precomposeUnicode
true  # this is the default in git 1.8.5 and higher
$ touch Prodsättning 
$ env -u LANG /bin/ls -b
Prodsa\314\210ttning
$ git status -s 
?? "Prods\303\244ttning"
通过在C语言环境中使用
ls
,我可以看到文件名中的字节,其中包含分解的值。但是git将字符组合成单个代码点,这样不同平台上的用户就不会产生不同的结果。不同git命令的情况

如果提交中的两个文件在Unicode规范化(或大小写折叠)之前具有相同的名称,那么当git签出这些文件时,它们将显示为“打架”:

$ git clone https://gist.github.com/jleedev/228395a4378a75f9e630b989c346f153 
$ git reset --hard && git status -s 
HEAD is now at fe1abe4 
 M "Prods\303\244ttning"
$ git reset --hard && git status -s 
HEAD is now at fe1abe4 
 M "Prodsa\314\210ttning"
因此,如果您只想删除该文件,可以根据需要继续。如果您想可靠地操作这些文件,请查看将选项设置为false,这样git将准确地存储您告诉它的文件名字节,但这可能会带来更多麻烦。我可能建议创建一个提交,将所有文件名转换为NFC,这样git就不会认为文件丢失了


对于这个问题,目前有一些较老的答案,但其中许多答案早于git规范化Unicode的能力,设置
core.quotepath=false
只会在这种情况下引起混淆。

ä似乎不等于
\303\244
(~580)或
\314\210
(~788; 528;)。。。您是否尝试过在控制台中使用TrueType字体来查看这里到底发生了什么?也许可以看看这里的答案来关闭八进制表示法:您的操作系统和文件系统可能是相关的。在Git Bash上设置区域设置和字符集在这种情况下可能会有帮助(比如Locale=sv_SE,Character Set=UTF-8(unicode)),我想您是在Mac上?在使用APFS的情况下,这种行为可能会稍有改变,它仍然不区分规范化,但不再主动规范化文件名。您仍然无法签出仅按规范化形式不同的文件。