18

This question already has an answer here:

I performed a git commit command and it gave me the following reply:

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

I know files can have user / group / other rwx permissions and those can be expressed as three bytes, like "644" or "755". But why is git showing six bytes here?

I've read the following articles but didn't find an answer:

marked as duplicate by That Brazilian Guy, Rui F Ribeiro, G-Man, slm Jun 30 '18 at 3:07

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

  • 7
    To nitpick, it isn't likely stored as 3 bytes, but rather as octal. Also, the Wikipedia link explains the fourth digit is for setuid/setgid attributes. – multithr3at3d Jun 18 '18 at 18:12
  • Is octal the same as octet? If so, isn't a byte (8 bits) the same as an octet (8 bits?) – That Brazilian Guy Jun 18 '18 at 18:17
  • 8
    No, an octet represents 8 bits while octal is a base-8 number system; each numeral in octal represents 3 binary digits. – multithr3at3d Jun 18 '18 at 18:20
31

The values shown are the 16-bit file modes as stored by git, following the layout of POSIX types and modes:

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.

That file doesn’t mention directories; they are represented using object type 0100.

Each digit in the six-digit value is in octal, representing three bits; 16 bits thus need six digits, the first of which only represents one bit:

Type|---|Perm bits

1000 000 111101101
1 0   0   7  5  5

1000 000 110100100
1 0   0   6  4  4

git doesn’t store arbitrary modes, only a subset of the values are allowed, from the usual POSIX types and modes (in octal, 12 for a symbolic link, 10 for a regular file, 04 for a directory) to which git adds 16 for git links. The mode is appended, using four octal digits. For files, you’ll only ever see 100755 or 100644 (although 100664 is also technically possible); directories are 040000 (permissions are ignored), symbolic links 120000. The set-user-ID, set-group-ID and sticky bits aren’t supported at all (they would be stored in the unused bits).

See also this related answer.

5

Traditionally Unix file systems used 16 bits to hold the type in 4 bits (e.g. regular file, directory, character special device... ) 9 bits of user/group/other permissions, the sticky bit, the SUID bit and the SGID bit.

You are seeing this in octal, so the rightmost 5digits can have the values 0 - 7 (representing 3 bits for a total of 15) and the left digit is 0 or 1 for the last bit.

On a Linux system man -s 7 inode (i.e. inode(7)) should tell you about this in the file type and mode section.

Not the answer you're looking for? Browse other questions tagged or ask your own question.