首页 > 解决方案 > 如何解码 git-log 中的转义文件名?

问题描述

我遇到了一个带有这样的文件的存储库:til/LINQサンプル.cs/LINQサンプル.cs/Program.cs,它在 git-log 中编码为"LINQ\343\202\265\343\203\263\343\203\227\343\203\253.cs/LINQ\343\202\265\343\203\263\343\203\227\343\203\253.cs/Program.cs"

Git 对具有非 ASCII 字符的文件名使用什么编码?

我已经尝试过的

标签: git

解决方案


Git 对具有非 ASCII 字符的文件名使用什么编码?

tl;博士。Git 存储文件系统所做的任何字节。在您的情况下,\343\202\265是八进制(以 8 为底)。转换为十六进制给出e382b5. 那是 サ 的 UTF-8 编码。git-log,默认情况下,会将文件名解释为 UTF-8。


Git 将文件名存储在树对象中,类似于目录。您可以通过添加来查看任何提交的顶级树对象^{tree}git cat-file -p HEAD^{tree}显示当前结帐的顶级树对象。

例如,如果我们有文件til/LINQサンプル.cs,我们会看到......

git cat-file -p HEAD^{tree}
040000 tree 4ef35381184b94ea9e9114a9ab37a9ed2061f598    til

这表示 til 是一个 ID 为 4ef35381184b94ea9e9114a9ab37a9ed2061f598 的树对象(目录)。如果我们检查那个树对象......

$ git cat-file -p 4ef35381184b94ea9e9114a9ab37a9ed2061f598
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    LINQサンプル.cs

也就是说,til/ 包含文件 LINQサンプル.cs,权限为 0644,存储在 blob 对象 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 中。

如果我们查看那个树对象,我们会看到...

100644 LINQ\343\202\265\343\203\263\343\203\227\343\203\253.cs

这是 LINQサンプル.cs 的 UTF-8 编码。


推荐阅读