Elimine completamente los archivos del repositorio de Git y de forma remota en GitHub


78

Agregué accidentalmente una carpeta de imágenes y me comprometí. Luego, hice un compromiso más. Luego eliminé esos archivos usando git rm -f ./imagesy comprometí nuevamente.

En este momento, he realizado muchas más confirmaciones en esa rama (maestra). En mi CABEZA, no tengo esa ./static/imagescarpeta.

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


Por alguna razón, las instrucciones de github y las siguientes no funcionaban para mí, pero esta respuesta del libro 'Pro Git' y a la que se hace referencia en esta respuesta SO funcionó perfectamente: stackoverflow.com/a/16877548/436014 - Tengo curiosidad sobre las diferencias entre filtro de árbol y filtro de índice ahora.
waffl

Respuestas:


125

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

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

Además, para eliminar todos los archivos eliminados de los 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 desea en una sola acción, aquí: git: eliminar para siempre archivos o carpetas del historial .

Otro enlace con mucha explicación: Eliminar datos sensibles .

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

(Comandos copiados de natacadola respuesta de la pregunta vinculada arriba.) Si ya eliminó los archivos de la copia de trabajo, lo siguiente debería funcionar. Descubra el hash de 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

1
Me dijiste que hiciera 'git rm --cached <file>'. Pero, ahora mismo, no tengo esa carpeta "./statis/images" ya que tengo mucho por delante en el proyecto. También he realizado muchas confirmaciones después de eso.
Abhijeet Rastogi

1
@shadyabhi Hm, tal vez intente agregar --ignore-unmatch al comando rm. Avísame si eso funciona.
Darhuuk

@Darhuuk Hice lo que dijiste. Tengo muchos resultados que dicen "rm ...". Hice $ git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch ./static/images' HEAD y luego $ rm -rf .git / refs / original / && git reflog expire - -todos && git gc --aggressive --prune. Aún así, mi tamaño de repositorio es de 2,7 MB. Mi fuente es de solo 525 KB. Mis confirmaciones son sólo 118 .. Es bastante grande para menos cambios.
Abhijeet Rastogi

@shadyabhi ¿Has probado la solución en la otra pregunta de StackOverflow que vinculé?
Darhuuk

@Darhuuk ¿Necesito usar rebase? Soy solo un principiante en todo esto, por lo que no lo estoy siguiendo exactamente.
Abhijeet Rastogi

9

Puede simplemente reajustar toda su rama y eliminar tanto la confirmación que agregó las imágenes como la confirmación que las eliminó.

git rebase -i master

Se le presentará una lista de confirmaciones. Elimina las líneas que tienen las confirmaciones falsas que deseas eliminar. ("dd" elimina una línea en vim, el editor predeterminado. Luego, guarde con ZZ)

Las confirmaciones colgantes luego se limpiarán en el curso de la recolección de basura git natural, un proceso que puede forzar con el comando dado en la respuesta de Darhuuk.

Editar: esto funcionará incluso si ha enviado 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 retirado de su rama. Deberían consultar "recuperándose de una rebase ascendente" .


Es de suponer que 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 el 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 puede dividir la confirmación con "git commit --amend".


4

Básicamente, estoy repitiendo la respuesta combinada con esta advertencia de formato de Windows , solo para que no se pierda como comentario.

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

Linea sola:

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

Varias líneas:

git filter-branch --index-filter \
    "git rm -r --cached --ignore-unmatch <file/dir>" HEAD
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.