Eliminar el directorio del repositorio remoto después de agregarlos a .gitignore

Respuestas:

1067

Las reglas en su .gitignorearchivo solo se aplican a los archivos no rastreados. Dado que los archivos en ese directorio ya estaban confirmados en su repositorio, debe quitar la etapa, crear un compromiso y enviarlo a GitHub:

git rm -r --cached some-directory
git commit -m 'Remove the now ignored directory "some-directory"'
git push origin master

No puede eliminar el archivo de su historial sin volver a escribir el historial de su repositorio; no debe hacerlo si alguien más está trabajando con su repositorio, o si lo está utilizando desde múltiples computadoras. Si aún desea hacer eso, puede usarlo git filter-branchpara reescribir el historial; aquí encontrará una guía útil .

Además, tenga en cuenta que la salida de git rm -r --cached some-directoryserá algo así como:

rm 'some-directory/product/cache/1/small_image/130x130/small_image.jpg'
rm 'some-directory/product/cache/1/small_image/135x/small_image.jpg'
rm 'some-directory/.htaccess'
rm 'some-directory/logo.jpg'

El rmes comentarios de git sobre el repositorio; los archivos todavía están en el directorio de trabajo.

Mark Longair
fuente
3
Si alguien más tira, ¿se eliminarán los archivos ahora ignorados o permanecerán intactos?
Martin Konicek
3
@ Martin Konicek: si el usuario que realiza esos cambios no tiene modificaciones en esos archivos, se eliminarán.
Mark Longair
@MarkLongair Qué hace -ry --cached. Gracias.
Labanino
13
@Labanino: -rsignifica recursivo, necesario si estás haciendo directorios completos. --cachedanula el comportamiento normal de git de eliminarlos del directorio de trabajo y organizar la eliminación para confirmar, y hace que git solo opere en el área de preparación lista para la confirmación. Es cómo le dices a git que quieres conservar tus copias locales de los archivos.
entheh
2
Esto funciona bien, pero primero tuve que hacerlo: git reset name_of_filepara que lo que se describe arriba funcione
Edvard Haugland
248

Hago esto:

git rm --cached `git ls-files -i --exclude-from=.gitignore` 
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

Lo que eliminará todos los archivos / carpetas que están en su git ignore, lo que le ahorrará tener que elegir cada uno manualmente


Esto parece haber dejado de funcionar para mí, ahora lo hago:

 git rm -r --cached . 
 git add .
 git commit -m 'Removed all files that are in the .gitignore' 
 git push origin master
Blundell
fuente
44
¡Gracias, esto me ayudó mucho! Si está utilizando Windows Powershell, puede hacerloforeach ($i in iex 'git ls-files -i --exclude-from=.gitignore') { git rm --cached $i }
Matthew
10
Probé tu segundo enfoque, ¡eliminó todos los archivos de mi git local!
artnikpro
2
Creo que se supone que debes navegar al subdirectorio y hacerlo. Corrígeme si estoy equivocado.
Entonces, ¿qué hemos aprendido hoy, niños? "¡No ejecute código aleatorio que encuentre en Stack Overflow!"
Jonathan Landrum
49

Según mi respuesta aquí: ¿Cómo eliminar un directorio del repositorio de git?

Para eliminar la carpeta / directorio solo del repositorio de git y no del local, intente 3 pasos simples.


Pasos para eliminar el directorio

git rm -r --cached FolderName
git commit -m "Removed folder from repository"
git push origin master

Pasos para ignorar esa carpeta en las próximas confirmaciones

Para ignorar esa carpeta de las próximas confirmaciones, cree un archivo en la raíz llamado .gitignore y coloque el nombre de esa carpeta en él. Puedes poner tantos como quieras

El archivo .gitignore se verá así

/FolderName

eliminar directorio

Eirenaios
fuente
1
Esto es exactamente lo que estaba buscando. Gracias :)
Rohit Singh
Me alegro de que haya ayudado @Rohit Singh
eirenaios
9

La primera respuesta de Blundell no funcionó para mí. Sin embargo, me mostró el camino correcto. He hecho lo mismo así:

> for i in `git ls-files -i --exclude-from=.gitignore`; do git rm --cached $i; done
> git commit -m 'Removed all files that are in the .gitignore'
> git push origin master

Le aconsejo que compruebe los archivos que se eliminarán primero ejecutando la siguiente declaración:

git ls-files -i --exclude-from=.gitignore

Estaba usando un archivo .gitignore predeterminado para Visual Studio y noté que estaba eliminando todas las carpetas de registro y bin en el proyecto, lo cual no era mi acción prevista.

Oncel Umut TURER
fuente
5

Nota: Esta solución solo funciona con Github Desktop GUI .

Al usar Github Desktop GUI es muy simple.

  1. Mueva la carpeta a otra ubicación (fuera de la carpeta del proyecto) temporalmente.

  2. Edite su .gitignorearchivo y elimine la entrada de carpeta que sería eliminar el repositorio maestro en la página de github.

  3. Confirmar y sincronizar la carpeta del proyecto.

  4. Vuelva a mover la carpeta a la carpeta del proyecto

  5. Reeditar .gitignorearchivo.

Eso es todo.

efkan
fuente
5

La respuesta de Blundell debería funcionar, pero por alguna extraña razón no funcionó conmigo. Primero tuve que canalizar los nombres de archivo generados por el primer comando en un archivo y luego recorrer ese archivo y eliminar ese archivo uno por uno.

git ls-files -i --exclude-from=.gitignore > to_remove.txt
while read line; do `git rm -r --cached "$line"`; done < to_remove.txt
rm to_remove.txt
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master
Chris Aelbrecht
fuente
4

Este método aplica el comportamiento estándar .gitignore y no requiere especificar manualmente los archivos que deben ignorarse .

No se puede usar --exclude-from=.gitignoremás: / - Aquí está el método actualizado:

Consejo general: comience con un repositorio limpio : ¡todo está comprometido, nada pendiente en el directorio o índice de trabajo y haga una copia de seguridad !

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

Si también necesita purgar los archivos recién ignorados del historial de confirmaciones de la rama o si no desea que los archivos ignorados recientemente se eliminen de futuras extracciones , consulte esta respuesta .

goofología
fuente
0

Si está trabajando desde PowerShell, intente lo siguiente como un solo comando.

PS MyRepo> git filter-branch --force --index-filter
>> "git rm --cached --ignore-unmatch -r .\\\path\\\to\\\directory"
>> --prune-empty --tag-name-filter cat -- --all

Entonces, git push --force --all .

Documentación: https://git-scm.com/docs/git-filter-branch

Shaun Luttin
fuente
¿En qué se git filter-branchdiferencia el uso del uso git rm? Originalmente pensaba que tenía que usar una versión de, git filter-branchpero la mayoría de los comentarios aquí recomiendan usar git rm. Por lo que entiendo, git rmsolo lo elimina del directorio de trabajo actual y del índice. Pero si se agregan múltiples confirmaciones antes, todavía estará en el repositorio.
alpha_989
Derecha. git rmeliminará el archivo de la última confirmación en el futuro. git filter-branchnos permite eliminarlo de toda la historia. Ver también: help.github.com/articles/…
Shaun Luttin el