Pregunta Elimina por completo los archivos del repositorio de Git y a distancia en GitHub


Accidentalmente agregué una carpeta de imágenes y me comprometí. Luego, hice un compromiso más. Luego eliminé esos archivos usando git rm -f ./images y comprometido de nuevo.

En este momento, he hecho muchos más commits en esa rama (maestro). En mi HEAD, no tengo eso ./static/images carpeta.

Debido a esto, mi tamaño de repo ha aumentado mucho. ¿Cómo puedo eliminar esos blobs por completo? Y también quiero eliminarlo de mi repositorio remoto de GitHub.


76
2018-04-06 08:36


origen


Respuestas:


Esto es lo que estás buscando: ignorar no elimina un archivo. Le sugiero que lea esa página, pero aquí está el comando específico para usar:

git filter-branch --index-filter \
'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

Además, para eliminar todos los archivos eliminados de las cachés que crea git, use:

rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune

Puede encontrar más información sobre el último comando, así como un script que hace todo lo que quiere en una sola acción, aquí: git: elimina para siempre archivos o carpetas del historial.

Otro enlaces con mucha explicación: Eliminar datos confidenciales.

[Editar] Además, vea esta pregunta de StackOverflow: Elimina los archivos confidenciales y sus confirmaciones del historial de Git.

(Comandos copiados de natacadorespuesta en la pregunta vinculada anteriormente.) Si ya ha eliminado los archivos de la copia de trabajo, lo siguiente debería funcionar. Descubre el hash para la confirmación que agregó los archivos no deseados. Entonces hazlo:

git filter-branch --index-filter \
'git update-index --remove filename' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force

124
2018-04-06 08:39



Podrías simplemente volver a establecer la base de toda la sucursal y eliminar tanto la confirmación que agregó las imágenes como la confirmación que las eliminó.

git rebase -i master

Se te presentará una lista de confirmaciones. Elimine las líneas que tienen las confirmaciones fraudulentas que desea eliminar. ("dd" borra una línea en vim, el editor predeterminado. Luego, guarde con ZZ)

Los commit colgantes se limpiarán en el transcurso de la recolección de basura natural de git, un proceso que puedes forzar con el comando dado en la respuesta de Darhuuk.

Editar: Esto funcionará incluso si ha presionado a un repositorio remoto, pero tendrá que presionar con --force. (Lo mismo se aplica a la solución git filter-branch).

Tenga en cuenta que esto será muy molesto para cualquiera que haya sacado de su sucursal. Deberían consultar "recuperándose de rebase aguas arriba".


Presumiblemente, su adición accidental original de imágenes es parte de un compromiso que desea mantener. En este caso, debe editar la confirmación durante la rebase para dividir las partes que desea conservar. Puede hacer esto reemplazando "pick" en la lista "rebase -i" para esa confirmación con "e" (para editar). El proceso de rebase se detendrá aquí y puedes dividir la confirmación con "git commit --amend".


9
2018-04-06 11:17



Estoy esencialmente repitiendo la respuesta combinado con esto Advertencia de formato de Windows, solo para que no se pierda como un comentario.

Tenga en cuenta el uso de comillas dobles en lugar de comillas simples, ya que depende del shell que está utilizando cómo se analizan las cadenas.

Linea sola:

git filter-branch --index-filter "git rm -r --cached --ignore-unmatch <file/dir>" HEAD

Múltiples líneas:

git filter-branch --index-filter \
    "git rm -r --cached --ignore-unmatch <file/dir>" HEAD

3
2017-10-03 14:03