Lista de archivos registrados en LFS en el gancho pre-receive
Estoy intentando escribir un gancho pre-receive de git que rechace archivos LFS mayores que un cierto tamaño (entre otras cosas).
Estoy intentando ejecutar git lfs ls-files -l -s <new-ref-value>
en mi script, pero devuelve
“`
2ec20be70bb1be824e124a61eabac40405d60de62c76d263eff9923f18c098ed – binary.dll (63 B)
No se pudo escanear el árbol Git LFS: falta el objeto: a405ce05ac78ea1b820d036676831a474ddf8f90
“`
Incluso no puedo ignorar el mensaje de error porque se detiene después del primer archivo.
Supongo que el problema tiene que ver con el hecho de que los commits aún no han sido “validados” en el remoto. Lo frustrante es que la información que necesito (nuevas rutas de archivos + tamaños) es accesible ya que está impresa para el primer archivo.
¿Hay alguna forma de ejecutar exitosamente el comando git lfs ls-files
con el nuevo valor de referencia en esta etapa?
¿Puedo obtener la lista de las rutas de archivos agregados y sus tamaños de alguna otra manera?
EDIT: Si es relevante de alguna manera, el servidor Git es una instancia de GitLab en su configuración predeterminada.
davy.ai
El mensaje de error sugiere que falta el objeto de árbol de Git LFS, lo cual podría ser causado por el hecho de que los commits aún no han sido validados en el remoto. Por lo tanto, es posible que no sea posible ejecutar el comando
git lfs ls-files
con el nuevo valor de referencia con éxito en esta etapa.Sin embargo, puedes obtener la lista de rutas y tamaños de archivo agregados de una manera diferente. Un enfoque posible es analizar la salida del comando
git diff-tree
, el cual compara el contenido y el modo de los archivos en dos objetos de árbol, y extraer las rutas y tamaños de archivo de los archivos agregados. Aquí tienes un ejemplo de script para hacer eso:Este script lee los ids de objeto de árbol antiguos y nuevos desde la entrada del pre-receive hook, y utiliza el comando
git diff-tree
para obtener la lista de archivos agregados entre los dos árboles. La salida se filtra mediantegrep
para seleccionar solo los archivos agregados, los cuales se procesan en un bucle. Para cada archivo agregado, el script extrae la ruta y el tamaño de archivo utilizando los comandoscut
ystat
, respectivamente. Luego utiliza el comandogit check-attr
para verificar si el archivo es un archivo LFS (es decir, tiene el atributo LFSfilter=lfs
establecido), y si es así, verifica si su tamaño excede el límite especificado por la variable$MAX_LFS_FILE_SIZE
. Si algún archivo LFS excede el límite, el script imprime un mensaje de error y sale con el código 1, lo cual rechazará el push. De lo contrario, el script sale con el código 0, lo cual permitirá el push.