Pregunta Eliminar un archivo de un repositorio de Git sin eliminarlo del sistema de archivos local


Mi confirmación inicial contenía algunos archivos de registro. he añadido *log para mi .gitignore, y ahora quiero eliminar los archivos de registro de mi repositorio.

git rm mylogfile.log

eliminará un archivo del repositorio, pero también lo eliminará del sistema de archivos local.

¿Cómo puedo eliminar este archivo del repositorio? sin borrando mi copia local del archivo?


2435
2017-07-17 14:56


origen


Respuestas:


Para un solo archivo:

git rm --cached mylogfile.log

Para un solo directorio:

git rm --cached -r mydirectory

3499
2017-07-17 14:57



Para eliminar una carpeta completa del repositorio (como los archivos Resharper), haga esto:

git rm -r --cached folderName

Había confirmado algunos archivos de Resharper y no quería que persistieran para otros usuarios del proyecto.


249
2018-04-04 18:14



También puede eliminar archivos del repositorio en función de su .gitignore sin eliminarlos del sistema de archivos local:

git rm --cached `git ls-files -i -X .gitignore`

O, como alternativa, en Windows Powershell:

git rm --cached $(git ls-files -i -X .gitignore)

162
2018-01-31 10:05



Además, si ha enviado datos confidenciales (por ejemplo, un archivo que contiene contraseñas), debe eliminarlo por completo del historial del repositorio. Aquí hay una guía que explica cómo hacerlo: http://help.github.com/remove-sensitive-data/


66
2017-08-21 12:16



Según mi respuesta aquí: https://stackoverflow.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository

Para eliminar carpeta / directorio o archivo solo desde el repositorio de git y no desde el local, pruebe 3 sencillos pasos.


Pasos para eliminar el directorio

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

Pasos para ignorar esa carpeta en los siguientes commits

Para ignorar esa carpeta a partir de los próximos commits, haga que un archivo en la raíz se llame .gitignore   y poner ese nombre de carpetas en él. Puedes poner tantos como quieras

.gitignore archivo se verá así

/FolderName

remove directory


58
2017-08-24 12:16



Una solución más genérica:

  1. Editar .gitignore archivo.

    ECHO mylogfile.log >> .gitignore

  2. Eliminar todos los elementos del índice.

    git rm -r -f --cached .

  3. Reconstruir índice.

    git add .

  4. Hacer nuevo commit

    git commit -m "Removed mylogfile.log"


54
2017-12-13 11:42



Git te permite ignorar esos archivos suponiendo que no han cambiado. Esta   se hace ejecutando el git update-index --assume-unchanged path/to/file.txt mando. Una vez marcado un archivo como tal, git lo hará   ignorar completamente cualquier cambio en ese archivo; no aparecerán cuando   ejecutando el estado de git o git diff, y nunca se comprometerán.

(De https://help.github.com/articles/ignoring-files)

Por lo tanto, no eliminarlo, pero ignorar los cambios en él para siempre. Creo que esto solo funciona localmente, por lo que los compañeros de trabajo aún pueden ver cambios en él a menos que ejecuten el mismo comando que el anterior. (Aún así es necesario verificar esto)

Nota: Esto no responde la pregunta directamente, sino que se basa en preguntas de seguimiento en los comentarios de las otras respuestas.


17
2018-01-28 11:46



Las respuestas anteriores no funcionaron para mí. Utilicé filter-branch para eliminar todos los archivos comprometidos

eliminar un archivo de un repositorio git con:

git filter-branch --tree-filter 'rm  file'

eliminar una carpeta de un repositorio git con:

git filter-branch --tree-filter 'rm -rf directory'

Esto elimina el directorio o archivo de todos los commits

puedes especificar una confirmación usando:

git filter-branch --tree-filter 'rm -rf directory' HEAD

O un rango

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

Para enviar todo a remoto, puedes hacer:

git push origin master --force

4
2018-01-12 13:59