Mac OS X 上的 SVN 文件名编码问题

Mac OS X 上的 SVN 文件名编码问题

我有一些文件名包含一些 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’的末尾。呵呵。

相关内容