Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read the mode field of git-ls-tree's output

$ git ls-tree fb3a8bdd0ce 100644 blob 63c918c667fa005ff12ad89437f2fdc80926e21c    .gitignore 100644 blob 5529b198e8d14decbe4ad99db3f7fb632de0439d    .mailmap 100644 blob 6ff87c4664981e4397625791c8ea3bbb5f2279a3    COPYING 040000 tree 2fb783e477100ce076f6bf57e4a6f026013dc745    Documentation 100755 blob 3c0032cec592a765692234f1cba47dfdcc3a9200    GIT-VERSION-GEN 100644 blob 289b046a443c0647624607d471289b2c7dcd470b    INSTALL 100644 blob 4eb463797adc693dc168b926b6932ff53f17d0b1    Makefile 100644 blob 548142c327a6790ff8821d67c2ee1eff7a656b52    README ... 

I know the last 3 oct digits are file mode, but what are the first 3 digits for? I can't find it out in git user's manual.

like image 824
an0 Avatar asked Apr 10 '09 13:04

an0


People also ask

What does 100644 mean?

Create Mode: - Tells about permissions given to that file, i.e., File permissions. Here, 100644 means the file is a normal file.

What is the functionality of Git ls tree?

the behaviour is similar to that of "/bin/ls" in that the <path> is taken as relative to the current working directory. E.g. when you are in a directory sub that has a directory dir, you can run git ls-tree -r HEAD dir to list the contents of the tree (that is sub/dir in HEAD ).

What is tree structure in Git?

A Git tree object creates the hierarchy between files in a Git repository. You can use the Git tree object to create the relationship between directories and the files they contain. These endpoints allow you to read and write tree objects to your Git database on GitHub.


2 Answers

From the Git index-format.txt file, regarding the mode:

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. 

Also, a directory object type (binary 0100) and group-writeable (0664 permissions) regular file are allowed as indicated by the fsck.c fsck_tree method. The regular non-executable group-writeable file is a non-standard mode that was supported in earlier versions of Git.

This makes valid modes (as binary and octal):

  • 0100000000000000 (040000): Directory
  • 1000000110100100 (100644): Regular non-executable file
  • 1000000110110100 (100664): Regular non-executable group-writeable file
  • 1000000111101101 (100755): Regular executable file
  • 1010000000000000 (120000): Symbolic link
  • 1110000000000000 (160000): Gitlink
like image 168
Dan Cruz Avatar answered Oct 12 '22 05:10

Dan Cruz


The 6 digits show the file mode using the classical UNIX notations. First two digits show file type, the third one is about set-uid/set-gid/sticky bits, and you know the last three.

Here is how man 2 stat documents it on my GNU/Linux system:

   The following flags are defined for the st_mode field:         S_IFMT     0170000   bit mask for the file type bit fields        S_IFSOCK   0140000   socket        S_IFLNK    0120000   symbolic link        S_IFREG    0100000   regular file        S_IFBLK    0060000   block device        S_IFDIR    0040000   directory        S_IFCHR    0020000   character device        S_IFIFO    0010000   FIFO        S_ISUID    0004000   set UID bit        S_ISGID    0002000   set-group-ID bit (see below)        S_ISVTX    0001000   sticky bit (see below)        S_IRWXU    00700     mask for file owner permissions        S_IRUSR    00400     owner has read permission        S_IWUSR    00200     owner has write permission        S_IXUSR    00100     owner has execute permission        S_IRWXG    00070     mask for group permissions        S_IRGRP    00040     group has read permission        S_IWGRP    00020     group has write permission        S_IXGRP    00010     group has execute permission        S_IRWXO    00007     mask for permissions for others (not in group)        S_IROTH    00004     others have read permission                   S_IWOTH    00002     others have write permission        S_IXOTH    00001     others have execute permission 
like image 32
adl Avatar answered Oct 12 '22 06:10

adl