我有一些文件名包含一些 Unicode 字符。Mac OS X 上的所有文件名都是 UTF8 编码的。也$LANG
设置为en_US.UTF-8
。
然而,这样做似乎svn
存在一些问题:
az@ip212 1054 (Integration) %ls
Abbildungen Verbesserungsvorschläge_Applets.odt
AllgemeineAnmerkungen.rtf Verbesserungsvorschläge_Applets.rtf
Geogebra Vorlagen
Texte
az@ip212 1055 (Integration) %svn ls
Abbildungen/
AllgemeineAnmerkungen.rtf
Geogebra/
Texte/
Verbesserungsvorschläge_Applets.rtf
Verbesserungsvorschläge_Applets.odt
Vorlagen/
az@ip212 1056 (Integration) %svn del Verb*.odt
svn: Use --force to override this restriction
svn: 'Verbesserungsvorschläge_Applets.odt' is not under version control
az@ip212 1057 (Integration) %svn status
? Verbesserungsvorschläge_Applets.odt
! Verbesserungsvorschläge_Applets.odt
az@ip212 1058 (Integration) %
正如您所看到的,svn del
无法识别文件名。甚至svn status
对此感到困惑。
我该如何解决这个问题?我也尝试过,LC_CTYPE=$LANG LC_ALL=$LANG LC=$LANG
但没有变化。
答案1
我从 B Smith-Mannschott 的 Subversion 邮件列表中得到了答复:
这是一个已知的问题。
http://subversion.tigris.org/issues/show_bug.cgi?id=2464
该问题评论主题中的一位发帖者建议如下:
Julian Mehnle 于 2009 年 8 月 6 日星期四 07:40:30 -0700 发表的补充评论:
那里是解决方法:安装 subversion MacPorts 包的“unicode_path”变体:
$ sudo port 安装 subversion +unicode_path
我自己还没有尝试过。
// 本
对我来说它似乎大部分时候都有效,但是我不确定现在还有什么问题。
我对 Subversion 源代码进行了一些调查,发现 UTF8 文件名支持非常糟糕。他们忽略了文件名在 UTF8 中可以有不同的表示这一事实。他们将所有这些不同的表示都视为不同的文件名。MacOSX 可能会在内部更改表示,而这正是 Subversion 所混淆的地方 —— 并且无法处理。
您可以在他们的源代码中看到,他们的路径比较函数基本上只是一个 memcpy。
我尝试修复它,但我不确定我是否修复了它(并且我不想在它上面浪费更多时间——它似乎现在可以工作但不确定)。
阅读上游错误报告以获取更多详细信息和后续讨论。
答案2
正如其他人在这里和其他地方提到的那样,根本原因如下:对于某些字符,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
>
答案3
你可以吗export LANG=de_DE.UTF-8
?
答案4
今天我遇到了这个问题。服务器在 Linux 上,两个 OS X 客户端正在同步它。试图删除服务器上的麻烦文件,但即使在那里,Unicode 字符也被标记得很奇怪。也许是时候让我转向 git 了?
附录:
我设法在服务器上做了一些改变,使得unicode双名文件问题似乎已经变成了“读取表示时校验和不匹配“在‘svn update’或‘svn checkout’的末尾。呵呵。