¿Cómo detecta git que un file ha sido modificado?

¿Cómo detecta git una modificación de file tan rápido?

¿Hash todos los files en el repository y comparar SHA1? Esto tomaría mucho time, ¿no?

¿O se compara atime , ctime o mtime ?

Git se esfuerza por convencerse por el valor lstat () solo de que el tree de trabajo coincide con el índice, porque volver a los contenidos del file es muy costoso.

Documentation / technical / racy-git.txt describe qué campos de statistics se utilizan y cómo se evitan algunas condiciones de carrera debido a la baja granularidad de mtime. Este artículo tiene más detalles .

Los valores stat no son a testing de manipulaciones, ver futámenes (3). Git puede ser engañado al perder un cambio en un file; eso no compromete la integridad del hash de contenido.

Hay un control inicial de mtime para informes como "estado de git", pero cuando se calcula el compromiso final, no importa el mtimes … es el SHA1 lo que importa.

Bueno, me atrevería a adivinar que está usando una combinación de llamadas stat() para resolver lo que parece que podría haber cambiado, y luego, a su vez, vincularlas para determinar si es este el motor de diferencia.

Puede ver el código del motor de diferencias aquí para tener una idea. Recorrí la base de código para asegurarme de que el command de estado efectivamente incluye este código (¡parece que muchas cosas sí!) Y en realidad todo esto tiene mucho sentido cuando se sabe que Git funciona bastante mal en Windows, donde está utilizando una capa de emulación para realizar estas llamadas de tipo POSIX: es un order de magnitud más lento hacer un git status en esa plataforma.

De todos modos, si no leo todo el código de arriba a abajo (¡lo que puedo hacer más adelante si tengo time!) Eso es todo lo que puedo tomar por ahora … tal vez alguien puede ser más definitivo si han trabajado con la base de código.

Nota: otra aceleración posible proviene del uso juicioso de las funciones en inline donde claramente tiene sentido, puede ver esto claramente en los encabezados.

[Editar: vea aquí para una explicación de stat() ]

Dependiendo de la plataforma, debería ser capaz de averiguar qué syscalls utiliza Git para determinar su estado. Pruebe el strace git status en Linux, el truss git status en SunOS o la herramienta aparentemente basada en DTrace que Apple envía con sus herramientas de desarrollo en Mac OS X.