正如其他人在这里和其他地方提到的那样,根本原因如下:
对于某些字符,UTF-8 允许以不同的方式对其进行编码(组合与分解)。
macOS 上的文件系统(HFS+ 或 APFS)以规范化分解形式 (NFD) 对文件名进行编码,而 Subversion 在添加文件时似乎使用不同的 UTF-8 编码。
所以当从命令行添加一个名为 ä_¥_é_ç_Ø.txt 的文件时:
> svn add ä_¥_é_ç_Ø.txt
A ä_¥_é_ç_Ø.txt
Subversion 以不同的编码存储文件名,这会导致问题:
> svn status
? ä_¥_é_ç_Ø.txt
! ä_¥_é_ç_Ø.txt
第一行是关于现有文件(其名称是 NFD 编码的)。此文件存在于文件系统中,但 Subversion 未知(“?”)。
第二行是关于添加的文件(其名称编码不同)。这个文件是 Subversion 已知的,但在文件系统中不存在(“!”)
要查看不同的编码,请使用 xxd:
> svn status | head -1 | xxd; echo; svn status | tail -1 | xxd
00000000: 3f20 2020 2020 2020 61cc 885f c2a5 5f65 ? a.._.._e
00000010: cc81 5f63 cca7 5fc3 982e 7478 740a .._c.._...txt.
00000000: 2120 2020 2020 2020 c3a4 5fc2 a55f c3a9 ! .._.._..
00000010: 5fc3 a75f c398 2e74 7874 0a _.._...txt.
这是我如何处理这个问题以使 Subversion 在 macOS 文件系统上使用 UTF-8 编码的文件名:
从 Subversion 添加或删除文件时,我不会在 Subversion 命令中键入或自动完成文件名。
相反,我ls 文件,复制文件名,并将其粘贴到 Subversion 命令中,它将显示编码的实际十六进制代码。
这样做会导致 Subversion 使用实际的文件名编码而不是使用转换后的形式。
例子:
> svn status
? ä_¥_é_ç_Ø.txt
> ls
ä_¥_é_ç_Ø.txt
复制文件名并粘贴到以下命令中
> svn add a<0308>_¥_e<0301>_c<0327>_Ø.txt
A ä_¥_é_ç_Ø.txt
> svn commit -m "Test"
Füge hinzu ä_¥_é_ç_Ø.txt
Übertrage Daten .erledigt
Übertrage Transaktion...
Revision 4 übertragen.
> svn status
>