es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    #!/bin/bash
    
    # Obtén los ids de objeto de árbol antiguos y nuevos desde la entrada del pre-receive hook
    read oldrev newrev refname
    
    # Obtén la lista de archivos agregados desde el comando git diff-tree
    IFS=$'\n' read -d '' -r -a added_files <<< "$(git diff-tree --name-status -r $oldrev $newrev | grep '^A')"
    for added_file in "${added_files[@]}"; do
      # Extrae la ruta y el tamaño de archivo de la salida de git diff-tree
      file_path=$(echo $added_file | cut -f 2)
      file_size=$(stat -c%s "$file_path")
    
      # Verifica si el archivo es un archivo LFS y si su tamaño excede el límite
      if git check-attr --all -- $file_path | grep "filter=lfs" > /dev/null; then
        if [ $file_size -gt $MAX_LFS_FILE_SIZE ]; then
          echo "Error: El archivo LFS $file_path es más grande que $MAX_LFS_FILE_SIZE bytes"
          exit 1
        fi
      fi
    done
    
    # Permite el push si todas las verificaciones pasan
    exit 0
    

    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 mediante grep 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 comandos cut y stat, respectivamente. Luego utiliza el comando git check-attr para verificar si el archivo es un archivo LFS (es decir, tiene el atributo LFS filter=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.

Comments are closed.