我执行了一个git commit
命令,它给了我以下回复:
7 files changed, 93 insertions(+), 15 deletions(-)
mode change 100644 => 100755 assets/internal/fonts/icomoon.svg
mode change 100644 => 100755 assets/internal/fonts/icomoon.ttf
mode change 100644 => 100755 assets/internal/fonts/icomoon.woff
我知道文件可以具有用户/组/其他 rwx 权限,这些权限可以表示为三个八进制数字,例如“644”或“755”。但为什么 git 这里显示六位数字呢?
我已阅读以下文章但没有找到答案:
答案1
显示的值是 16 位文件模式由 Git 存储,按照布局POSIX 类型和模式:
32-bit mode, split into (high to low bits)
4-bit object type
valid values in binary are 1000 (regular file), 1010 (symbolic link)
and 1110 (gitlink)
3-bit unused
9-bit unix permission. Only 0755 and 0644 are valid for regular files.
Symbolic links and gitlinks have value 0 in this field.
该文件没有提到目录;它们使用对象类型 0100 表示。Gitlinks 用于子模块。
六位值中的每一位都是八进制,代表三位;因此 16 位需要 6 位数字,其中第一位仅代表一位:
Type|---|Perm bits
1000 000 111101101
1 0 0 7 5 5
1000 000 110100100
1 0 0 6 4 4
Git 不存储任意模式,只允许使用常见 POSIX 类型和模式(八进制,12 表示符号链接,10 表示常规文件,04 表示目录)的值的子集,git 将 16 添加到其中用于 Git 链接。使用四个八进制数字附加模式。对于文件,您只会看到 100755 或 100644(尽管 100664 在技术上也是可能的);目录为 040000(权限被忽略),符号链接为 120000。根本不支持 set-user-ID、set-group-ID 和粘性位(它们将存储在未使用的位中)。
也可以看看这个相关答案。
答案2
传统上,Unix 文件系统使用 16 位来保存类型,其中 4 位(例如常规文件、目录、字符特殊设备...) 9 位用户/组/其他权限、粘性位、SUID 位和 SGID 位。
您看到的是八进制形式,因此最右边的 5 位数字可以具有值 0 - 7(代表 3 位,总共 15 位),而左边的数字是最后一位的 0 或 1。
在 Linux 系统上man -s 7 inode
(即索引节点(7))应该在文件类型和模式部分告诉您这一点。