我们正在Mac / Windows / Linux上工作。 Windows用户已在Eclipse下使用SVN提交了一些名称包含特殊字符的文件。在MacO上,执行全新签出(使用命令行)时,SVN无法匹配那些目录/文件。
$ svn co [...]
$ svn st
? ShapeLibraries/Cahiers spéciaux
! ShapeLibraries/Cahiers spéciaux
[...]
由于文件是UTF-8编码的,所以我使用latin-1查看了字符串,以了解char转换将是什么:
第一个字符串格式错误,而第二个字符串格式正确(UTF8é== Latin1é)
是什么原因造成的?有什么解决方案(除了重命名所有不带特殊字符的文件)?
谢谢
答案 0 :(得分:1)
这两个名称是不同的Unicode代码点序列。在问题文字上使用JavaScript:
"é".codePointAt(0).toString(16)
> 65
"é".codePointAt(1).toString(16)
> 301
但是
"é".codePointAt(0).toString(16)
> e9
U + 0065是小拉丁字 U + 0301正在合并重音 U + 00E9是带有小写字母的拉丁小写字母E
它们在语义上是相同的。程序应该将它们进行比较。尝试在所有对其的引用中重命名它们:存储库,本地文件系统,项目文件等。
答案 1 :(得分:1)
正如其他人在这里和其他地方提到的,根本原因如下: 对于某些字符,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
>