我有一个 java 项目,其中包含名称中带有变音符号的文件。我如何设置一个 git 存储库,以便它可以与 Eclipse 的 EGit 插件一起使用。
我已经尝试过一个简单的
git init
git add *
但正如您在这篇文章中看到的那样,这被证明是无效的。
我想我必须以某种方式告诉 git 它必须将文件名视为 utf8。
我在 Max OSX 10.7 上,但我在 Windows 7 Pro 上看到了同样的问题。
有任何想法吗?
MacOS 以分解形式 (NFD) 对字符(在文件名中)进行编码,而其他所有人都使用组合形式 (NFC)。使用 Git 添加文件名时,分解后的表单会进入存储库,因为 Git(Windows 除外)不会重新编码它从磁盘读取的文件名。
EGit 假定使用组合形式。如果您在 Mac 上使用非 ascii 名称,请仅在 repo 中使用 EGit 或 JGit,除非您知道这些问题。
从 1.7.10 开始的适用于 Windows 的 Git 使用 UTF-8 NFC。
组合形式意味着像“Ä”这样的字符被编码为一个unicode字符,而分解形式意味着它被编码为“A”+“在前一个字符上方添加两个点”。
$ touch Ä
$ echo Ä|od -tx1a
0000000 c3 84 0a
? 84 nl
0000003
$ ls|od -tx1a
0000000 41 cc 88 0a
A ? 88 nl
0000004
$
更新:从 1.7.12 开始,OS X 上的本机 git 可以选择以与 Windows 上的 EGit 和 Git 兼容的方式预先组合非 ASCII 字符。您需要将 core.precomposeunicode 配置为 true。
AFAIK JGit 和 EGit 始终使用 UTF-8 路径编码,但本机 git 不保证 [1]
[1] 在http://schacon.github.com/git/git-commit.html中搜索“编码”, 另见http://git.661346.n2.nabble.com/Path-character-encodings-td7346463。 html
注意:即使core.precomposeunicode
设置为true
,您仍然可能遇到问题,如Jeff King的提交 750b2e4中所示 ( )peff
core.precomposeunicode
分解文件名失败如果您的 git 存储库中有现有的分解文件名(例如,使用未预先组合 unicode 的旧版本 git 创建的文件名),带有
core.precomposeunicode
set 的现代 git 不能很好地处理它们。问题是我们将来自磁盘的路径标准化为它们的预组合形式,然后将它们与索引中的文字字节进行比较。
如果您在索引中有预先组合的表单,这会使事情变得更好。
如果您实际上在索引中有分解的形式,事情会变得更糟。因此,具有分解文件名的路径可能会将其预组合变体列为未跟踪文件(即使预组合变体根本不存在于磁盘上)。