git - 如何解码 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 字符的文件名使用什么编码?
我已经尝试过的
- 使用不同的
--encoding
参数值 - 阅读git-log 文档
- 将 unicode 文本转换为字节:
- 文字(4 个字形):サンプル
- 日志中编码(12个数字):\343\202\265\343\203\263\343\203\227\343\203\253
- 文本为字节(12 个字节):227 130 181 227 131 179 227 131 151 227 131 171
解决方案
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 编码。
推荐阅读
- jinja2 - GitHub Actions 安装 jinja j2
- python - Mongoengine 的 .limit() 无法正常工作
- java - Java:使用计算器 sumTwoNumbers、subtractTwoNumbers、divideTwoNumbers 和 multiplyTwoNumbers 的测试失败
- datatable - 如何使用 gam() 拟合广义加法模型,其中始终将所有列用作预测变量(模型拟合中没有硬编码部分)
- python - 将特定数据附加到字典中的函数
- javascript - 无法在 slack 上为使用 Microsoft Bot Framework 的机器人构建发送或接收消息
- json - Pandas 从嵌套的 json 中读取一个参数
- python - Why does uWSGI not reject requests when the listen queue should be full?
- javascript - 使用javascript从开始标记删除选定的html元素到结束标记的值
- ruby-on-rails - 如何在 Rails 应用程序中模拟 curl 请求?