2009-04-10 14 views
80
$ 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 
... 

Sé que los últimos 3 dígitos de oct son el modo de archivo, pero ¿para qué sirven los 3 primeros dígitos? No puedo encontrarlo en el manual del usuario de git.Cómo leer el campo de modo de la salida de git-ls-tree

+0

git ls-árbol también tiene un '-r': bandera recursiva. – ThorSummoner

+2

Git está tan roto ... Intente restablecer los permisos con algo así como 'chmod 0100755 ' para hacer feliz a Git. O incluso más gracioso, git chmod 'debido a los modos de archivo de Git (no existe) ... También vea preguntas como [¿Cómo elimino archivos que dicen" modo antiguo 100755 nuevo modo 100644 "de cambios no realizados en Git?] (http://stackoverflow.com/q/1257592/608639), [¿Cómo recuperar los permisos del archivo a lo que git "cree" que debería estar el archivo?] (http://stackoverflow.com/q/2517339). Esta herramienta es una broma quebrada ... – jww

Respuesta

53

Los 6 dígitos muestran el modo de archivo utilizando las notaciones clásicas de UNIX. Los primeros dos dígitos muestran el tipo de archivo, el tercero es sobre set-uid/set-gid/bits adhesivos, y usted conoce los últimos tres.

Aquí es cómo man 2 stat documentos en mi sistema GNU/Linux:

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 
+0

Gracias, parece que he pasado por alto la parte del tipo de archivo del modo de archivo. – an0

+8

Puede valer la pena agregar a su respuesta que los submódulos se enumeran con un modo de archivo de 160000 y el tipo de objeto "confirmar". –

+2

¿Por qué el '0' inicial en las líneas superiores (por ejemplo,' 0170000' en lugar de '170000'), ya que es' 0' para todas las líneas, ¿por qué no simplemente omitirlo? –

98

Desde el archivo de Git index-format.txt, en relación con el modo:

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. 

También, un tipo de objeto de directorio (binario 0100) y el archivo regular grabable por grupo (0664 permisos) están permitidos según lo indicado por el método fsck.cfsck_tree. El archivo no grabable de grupo normal no es un modo estándar compatible con las versiones anteriores de Git.

Esto hace que los modos válidos (como binario y octal):

  • 0100000000000000 (040000): Directorio
  • 1000000110100100 (100644): Regular no ejecutable archivo
  • 1000000110110100 (100664): Regular no -executable group-writeable file
  • 1000000111101101 (100755): archivo ejecutable regular
  • 1010000000000000 (120000): Enlace simbólico
  • 1110000000000000 (160000): Gitlink
+0

Weird ... Acabo de enviar algunos archivos '644' en git y el mensaje de confirmación dijeron que se crearon en el repositorio como '664' – MestreLion

+2

El modo de directorio no es válido porque nunca sucederá. Git no rastrea los directorios, porque los directorios en Git solo existen implícitamente con contenido * ignorado *. – nemesis

+1

@nemesis Git usa el modo de directorio ('040000') para representar directorios. Por favor, consulte el 'fsck 'vinculado.c' code, o simplemente ejecute 'git ls-tree HEAD' en un repositorio de Git que contiene directorios. –

Cuestiones relacionadas