Git树对象中条目采用何种排序方式?
Git树对象的排序规则
Git对树对象中的条目采用基于字节值的逐字节排序,完全遵循C标准库strcmp函数的比较逻辑,而非自然语言中的字典序或Unicode字符排序规则,具体细节如下:
- 逐字节比较:将文件名看作纯字节序列,按每个字节的ASCII/UTF-8值逐一对比,字节值小的字符串排在前面。
- 前缀处理:当一个字符串是另一个字符串的前缀时,较短的字符串会排在后面。比如
entrie-xxx这类以entrie为前缀的长文件名,会排在单独的entrie前面。
对应你给出的例子:
常规字典序预期:
entrie, entrie-dopes, entrie-hope, entrie-сase
Git实际排序结果:
entrie-сase, entrie-dopes, entrie-hope, entrie
造成差异的原因是:
- 所有带
-的长文件名都是entrie的前缀扩展,因此Git会把它们排在单独的entrie前面; - 带
-的条目之间,Git按后续字符的字节值排序——如果entrie-сase中的с是拉丁字母c(ASCII值0x63),它的字节值小于d(0x64)和h(0x68),所以会排在最前面。如果是西里尔字母с,其UTF-8编码的第一个字节值(0xD1)大于d的字节值,这种情况下Git的排序会和你给出的结果有出入,可能是输入时的字符混淆导致。
内容的提问来源于stack exchange,提问作者Alexander Strigunov
相关产品推荐
相关产品推荐

