Encuentra el historial de git y la ruta actual del file desde hash de objects

Dado el hash de un object blob (que puede haberse tomado en una revisión anterior), ¿cómo es posible encontrarlo?

  • la historia y
  • la ruta del file correspondiente en la revisión actual?

Algunos detalles en cuanto al caso de uso:

Usamos un repository de git para almacenar files que son parte de la generación de documentos.

Los files cambian con el time (de ahí el repository;)). Los documentos se guardan y se refieren a los files en el repository.

Para mayor coinheritance, los documentos guardados harán reference a la versión del file en el punto de time donde se creó el documento.

Así que pensé que mantener el hash de objects debería ser adecuado, ya que esto identifica con precisión qué versión de file se utilizó.

Sin embargo, ahora me encuentro con el siguiente problema: quiero proponer actualizar el documento a versiones más nuevas de los files. Entonces tengo que

  • averiguar si hay nuevas versiones
  • debido a que la generación de documentos ocurre con las herramientas de command-line, necesito la location actual del file en el sistema de files (puede haber sido renombrado o movido).

Todavía no pude encontrar una manera fácil de lograr esto. ¿Hay alguna, o debería reconsiderar mi forma de hacer un seguimiento de los files comstackdos?

Para get la historia basada en un hash de objects, puedes este script bash:
Pase el hash como la línea de command arg, y obtendrá el commit sha.

#!/bin/sh blob=$1 git rev-list --all | while read commit; do if git ls-tree -r $commit | grep -q $blob; then echo $commit fi done 

Cuando tienes el commit sha, puedes ejecutar

 git log [sha] --name-only 

Esto te dará el nombre del file. Y finalmente:

git log –seguir – [nombre del file]

Esto solo funcionará si la ruta del file de la versión actual es la misma que en el momento de la instantánea. Pero mostrará todos los cambios de files históricos (suponiendo que se usara git mv)

Si este no es el caso, aún se puede hacer usando git ls-tree para recorrer todas las confirmaciones, y si se llega a un nodo de tree atravesándolo a sus nodos de hoja de files. Sin embargo, tendrá que resolver manualmente los problemas entre la ruta A) a / b / foo.txt y la ruta B) c / d / foo.txt

¿Es el mismo foo.txt o diferente?

En mi experiencia, es mejor tener una buena convención de nomenclatura de files y almacenar el commit sha, no el file blob sha. Es mucho más fácil acceder a un file blob sha desde un commit luego hacia el otro lado.