Tengo un repositorio git de 300 MB. El tamaño total de mis archivos actualmente desprotegidos es de 2 MB, y el tamaño total del resto del repositorio de git es de 298 MB. Esto es básicamente un repositorio de solo código que no debería tener más de unos pocos MB.
Sospecho que alguien cometió accidentalmente algunos archivos grandes (video, imágenes, etc.), y luego los eliminó ... pero no de git, por lo que el historial todavía contiene archivos grandes inútiles. ¿Cómo puedo encontrar los archivos grandes en el historial de git? Hay más de 400 commits, por lo que ir uno por uno no es práctico.
NOTA : mi pregunta no es acerca de cómo eliminar el archivo , sino cómo encontrarlo en primer lugar.
Respuestas:
He encontrado este script muy útil en el pasado para encontrar objetos grandes (y no obvios) en un repositorio de git:
Eso le dará el nombre del objeto (SHA1sum) del blob, y luego puede usar un script como este:
... para encontrar el commit que apunta a cada uno de esos blobs.
fuente
🚀 Una carcasa increíblemente rápida de una sola línea 🚀
Este script de shell muestra todos los objetos de blob en el repositorio, ordenados de menor a mayor.
Para mi repositorio de muestra, se ejecutó aproximadamente 100 veces más rápido que los otros que se encuentran aquí.
En mi confiable sistema Athlon II X4, maneja el repositorio Kernel de Linux con sus 5.6 millones de objetos en poco más de un minuto .
El guión base
Cuando ejecute el código anterior, obtendrá una buena salida legible para humanos como esta:
Usuarios de macOS : como
numfmt
no está disponible en macOS, puede omitir la última línea y tratar con tamaños de bytes sin formato obrew install coreutils
.Filtración
Para lograr un mayor filtrado , inserte cualquiera de las siguientes líneas antes de la
sort
línea .Para excluir archivos que están presentes
HEAD
, inserte la siguiente línea:Para mostrar solo los archivos que exceden el tamaño dado (por ejemplo, 1 MiB = 2 20 B), inserte la siguiente línea:
Salida para computadoras
Para generar una salida que sea más adecuada para su posterior procesamiento por parte de las computadoras, omita las dos últimas líneas del script base. Hacen todo el formateo. Esto te dejará con algo como esto:
Eliminación de archivos
Para la eliminación real del archivo, consulte esta pregunta SO sobre el tema .
fuente
brew install coreutils
reemplazarlocut
congcut
ynumfmt
congnumfmt
.git large
¿alguien?He encontrado una solución única en la página wiki del Departamento de Física de ETH Zurich (cerca del final de esa página). Simplemente haga una
git gc
para eliminar la basura obsoleta, y luegole dará los 10 archivos más grandes en el repositorio.
También hay una solución más perezosa ahora disponible, GitExtensions ahora tiene un complemento que hace esto en la interfaz de usuario (y también maneja las reescrituras del historial).
fuente
git rev-list --objects --all | grep -E `git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}' | sed ':a;N;$!ba;s/\n/|/g'`
Paso 1 Escriba todos los archivos SHA1 en un archivo de texto:
Paso 2 Ordena los blobs de mayor a menor y escribe los resultados en el archivo de texto:
Paso 3a Combine ambos archivos de texto para obtener información sobre el nombre del archivo / sha1 / tamaño:
Paso 3b Si tiene nombres de archivos o rutas que contienen espacios, pruebe esta variación del Paso 3a. Se utiliza en
cut
lugar deawk
obtener las columnas deseadas incl. espacios desde la columna 7 hasta el final de la línea:Ahora puede mirar el archivo bigtosmall.txt para decidir qué archivos desea eliminar de su historial de Git.
Paso 4 Para realizar la eliminación (tenga en cuenta que esta parte es lenta ya que examinará cada confirmación en su historial en busca de datos sobre el archivo que identificó):
Fuente
Los pasos 1-3a se copiaron de Buscar y purgar archivos grandes del historial de Git
EDITAR
El artículo se eliminó en algún momento de la segunda mitad de 2017, pero aún se puede acceder a una copia archivada utilizando Wayback Machine .
fuente
git gc && join -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 ) | sort -k2gr
join -t' ' -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sed 's/[[:space:]]/\t/' | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 | sed 's/[[:space:]]\+/\t/g' ) | sort -k2gr | less
. Tenga en cuenta que debe ingresar el carácter TAB real despuésjoin -t'
con CTRL + V <TAB> por geekbraindump.blogspot.ru/2009/04/unix-join-with-tabs.html$'\t'
debería darte una pestaña.echo -n $'\t' | xxd -ps
->09
Deberías usar BFG Repo-Cleaner .
Según el sitio web:
El procedimiento clásico para reducir el tamaño de un repositorio sería:
fuente
--strip-biggest-blobs 500
hacer?Si solo desea tener una lista de archivos grandes, me gustaría proporcionarle la siguiente línea:
Cuyo resultado será:
La última entrada en la lista apunta al archivo más grande en su historial de git.
Puede usar esta salida para asegurarse de que no está eliminando cosas con BFG que hubiera necesitado en su historial.
fuente
1.1, 1.2, 2.3
números?<filenumber>.<field>
especifica el orden de la combinación. Ver man.cx/join para más información.Si está en Windows, aquí hay un script de PowerShell que imprimirá los 10 archivos más grandes en su repositorio:
fuente
You cannot call a method on a null-valued expression. At line: 2 char: 1
. Sin embargo, esta respuesta funcionó: stackoverflow.com/a/57793716/2441655 (también es más corta)Tratar
git ls-files | xargs du -hs --threshold=1M
.Usamos el siguiente comando en nuestra canalización de CI, se detiene si encuentra archivos grandes en el repositorio de git:
fuente
No pude hacer uso de la respuesta más popular porque el
--batch-check
cambio de línea de comandos a Git 1.8.3 (que tengo que usar) no acepta ningún argumento. Los pasos siguientes se han probado en CentOS 6.5 con Bash 4.1.2Conceptos clave
En Git, el término blob implica el contenido de un archivo. Tenga en cuenta que una confirmación puede cambiar el contenido de un archivo o nombre de ruta. Por lo tanto, el mismo archivo podría referirse a un blob diferente dependiendo de la confirmación. Un determinado archivo podría ser el más grande en la jerarquía de directorios en un commit, mientras que no en otro. Por lo tanto, la cuestión de encontrar confirmaciones grandes en lugar de archivos grandes coloca los asuntos en la perspectiva correcta.
Para el impaciente
El comando para imprimir la lista de blobs en orden descendente de tamaño es:
Salida de muestra:
Para eliminar dichos blobs, use BFG Repo Cleaner , como se menciona en otras respuestas. Dado un archivo
blobs.txt
que solo contiene los hash de blob, por ejemplo:Hacer:
La pregunta es sobre encontrar los commits, que es más trabajo que encontrar blobs. Para saber, sigue leyendo.
Más trabajo
Dado un hash de confirmación, un comando que imprime hash de todos los objetos asociados con él, incluidos los blobs, es:
Entonces, si tenemos tales salidas disponibles para todos los commits en el repositorio, entonces dado un hash de blob, el montón de commits son los que coinciden con cualquiera de las salidas. Esta idea está codificada en el siguiente script:
Si los contenidos se guardan en un archivo llamado
find-commits.sh
, una invocación típica será la siguiente:Como anteriormente, el archivo
blobs.txt
enumera hash de blob, uno por línea. loscreate_db()
función guarda un caché de todos los listados de confirmación en un subdirectorio en el directorio actual.Algunas estadísticas de mis experimentos en un sistema con dos procesadores Intel (R) Xeon (R) CPU E5-2620 2.00GHz presentados por el sistema operativo como 24 núcleos virtuales:
Tenga en cuenta que el script tiene un solo subproceso. Por lo tanto, solo se usaría un núcleo a la vez.
fuente
Solución Powershell para Windows Git, encuentre los archivos más grandes:
fuente
Comience analizando, validando y seleccionando la causa raíz. Úselo
git-repo-analysis
para ayudar.También puede encontrar algo de valor en los informes detallados generados por BFG Repo-Cleaner , que se pueden ejecutar muy rápidamente clonando en una gota de Océano Digital utilizando su rendimiento de red de 10MiB / s.
fuente
Me topé con esto por la misma razón que cualquier otra persona. Pero los guiones citados no funcionaron para mí. Hice uno que es más un híbrido de los que he visto y ahora vive aquí: https://gitlab.com/inorton/git-size-calc
fuente