git 中六位八进制数字的文件权限。这是什么意思?

git 中六位八进制数字的文件权限。这是什么意思?

我执行了一个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))应该在文件类型和模式部分告诉您这一点。

相关内容