我们正在Mac/Windows/Linux上工作。Windows用户在Eclipse下使用SVN提交了一些名称包含特殊字符的文件。在MacOs上,执行新签出(使用命令行)时,SVN无法匹配这些目录/文件。
$ svn co [...]
$ svn st
? ShapeLibraries/Cahiers spéciaux
! ShapeLibraries/Cahiers spéciaux
[...]
因为文件是UTF-8编码的,所以我使用latin-1查看了字符串,看看字符转换是什么:
第一个字符串格式错误,而第二个字符串没有问题(UTF8é== Latin1ç©)
你知道这是什么原因吗?是否有任何解决方案(除了重命名所有不带特殊字符的文件)?
谢谢
发布于 2019-12-01 22:25:16
正如其他人在这里和其他地方提到的,根本原因如下:对于某些字符,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
>
发布于 2019-03-14 01:18:21
这两个名称是不同的Unicode码点序列。对问题中的文本使用JavaScript:
"é".codePointAt(0).toString(16)
> 65
"é".codePointAt(1).toString(16)
> 301
但
"é".codePointAt(0).toString(16)
> e9
U+0065是拉丁文小写e U+0301是组合锐音U+00E9是拉丁文小写字母E和锐音
它们在语义上是相同的。程序应该将它们进行相同的比较。尝试在所有对它的引用中将一个重命名为另一个:存储库、本地文件系统、项目文件等。
https://stackoverflow.com/questions/55143357
复制相似问题