¿Qué sucede bajo el capó en una caja de Git?

Me he dado count de que si estoy en el master y luego reviso una twig particularmente antigua (digamos … uno o dos meses atrás), demora unos 10 segundos. Una vez que lo he comprobado, si cambio de esta twig a la maestra o desde el maestro a esta twig, la velocidad de pago se networkinguce a aproximadamente 1 segundo.

Entiendo que los pointers están cambiando (es decir, el file HEAD que apunta a la reference, que apunta a todos los objects asociados) cuando haces un pago por git. ¿Pero qué más está sucediendo bajo el capó en un pago por git? ¿Y por qué el process de pago entre dos sucursales se acelera después de haberlo hecho una vez?

¿Quizás estamos desempacando objects o algo así? Me imagino que si revisamos una sucursal, nos gustaría tener todo el contenido asociado en forma de objects sueltos, ya que parece estar más disponible y fácil de editar en comparación con los deltas que eventualmente GitGC empaqueta.

¡Gracias!

Excepto la actualización del file principal y el file reflog (que no demora), lo único que se hace es search objects comprimidos (y a veces empaquetados), descomprimirlos y rellenar el directory de trabajo. Creo que la diferencia en los times solo se debe a cachings de memory / disco / CPU. Nada mas…

Git 2.13 ilustra un poco más lo que está sucediendo con un pago por git, a través de esta optimization que propone:
Consulte commit b986df5 , commit 06b6d81 , commit e549463 , commit 350d870 (19 abr 2017) y commit a6db3fb (14 abr 2017) por Jeff Hostetler ( jeffhostetler ) .
(Fusionada por Junio ​​C Hamano – gitster – in commit 6cbc478 , 26 de abril de 2017)

Enseña has_dir_name() y add_index_entry_with_check() para ver si la ruta del nuevo elemento es mayor que la última ruta en la matriz de índice antes de intentar searchla.

Agregar:

Durante el pago, merge_working_tree() rellena el nuevo índice en order orderado, por lo que este cambio saveá una búsqueda binaria por file.

has_dir_name() está buscando colisiones de files / directorys en el índice y tiene que considerar cada prefijo de subdirectory a su vez.
Esto puede causar búsquedas binarias múltiples para cada ruta.

Vea las ganancias para repos grandes en commit b986df5 .