¿Cómo puedo eliminar un archivo de un repositorio de Git?

1924

He agregado un archivo llamado "file1.txt"a un repositorio Git. Después de eso, lo comprometí, agregué un par de directorios llamados dir1y dir2, y los comprometí al repositorio de Git.

Ahora el repositorio actual tiene "file1.txt", dir1y dir2. ¿Cómo puedo eliminar "file1.txt"sin afectar a otros, como dir1y dir2?

webminal.org
fuente
85
git rmes la respuesta correcta, pero recuerde que el archivo seguirá ahí en la historia. Si desea eliminar un archivo porque tenía información confidencial, deberá hacer algo más drástico. (Cambiar la historia, especialmente para el contenido que ya ha promovido, es una acción drástica, y debe evitarse si es posible.)
Keith Thompson
8
Nota: en GitHub, ahora puede eliminar directamente un archivo de la interfaz web (sin tener que clonar el repositorio). Vea mi respuesta a continuación .
VonC
44
@KeithThompson, ¿qué pasos podrían ser si desesperadamente quiero hacer eso?
lessthanl0l
55
@ lessthanl0l: stackoverflow.com/q/872565/827263
Keith Thompson
help.github.com/articles/…
Trevor Boyd Smith

Respuestas:

3224

Uso git rm.

Si desea eliminar el archivo del repositorio de Git y el sistema de archivos , use:

git rm file1.txt
git commit -m "remove file1.txt"

Pero si desea eliminar el archivo solo del repositorio de Git y no eliminarlo del sistema de archivos, use:

git rm --cached file1.txt
git commit -m "remove file1.txt"

Y para impulsar los cambios al repositorio remoto

git push origin branch_name  
Greg Hewgill
fuente
93
También útil: git rm -r directorio // Para eliminar el directorio y el contenido
Reg
10
Sin embargo, eso no va a eliminar ese archivo en otras confirmaciones.
VaTo
66
@SaulOrtega: Eso es correcto. Para eliminar un archivo de confirmaciones anteriores (cambiar el historial pasado), consulte la página de ayuda de GitHub en Eliminar datos confidenciales .
Greg Hewgill
15
Tenga en cuenta que esto también eliminará el archivo localmente. Si solo desea eliminarlo del repositorio, haga lo siguiente: git rm --cached file1.txt
Weston Ganger
55
Vale la pena señalar que si ese archivo contiene información confidencial (por ejemplo, credenciales), debe cambiar esas credenciales de inmediato . Para citar a GitHub "Una vez que haya enviado una confirmación a GitHub, debe considerar que los datos que contiene están comprometidos. ¡Si confirmó una contraseña, cámbiela! Si confirmó una clave, genere una nueva".
c1moore
608

git rm file.txtelimina el archivo del repositorio pero también lo elimina del sistema de archivos local .

Para eliminar el archivo del repositorio y no eliminarlo del sistema de archivos local, use:
git rm --cached file.txt

La siguiente situación exacta es donde uso git para mantener el control de versiones para el sitio web de mi empresa, pero el directorio "mickey" era una carpeta tmp para compartir contenido privado con un desarrollador de CAD. Cuando necesitaba archivos ENORMES, hice un directorio privado y desvinculado y puse los archivos allí para que los buscara a través del navegador. Olvidando que hice esto, luego realicé una git add -Adesde el directorio base del sitio web. Posteriormente, git statusmostró los nuevos archivos que necesitan confirmación. Ahora necesitaba eliminarlos del seguimiento y control de versiones de git ...

La salida de muestra a continuación es de lo que me acaba de pasar, donde eliminé involuntariamente el .003archivo. Afortunadamente, no me importa lo que sucedió con la copia local .003, pero algunos de los otros archivos actualmente modificados fueron actualizaciones que acabo de hacer en el sitio web y ¡sería épico haber sido eliminado en el sistema de archivos local! "Sistema de archivos local" = el sitio web en vivo (no es una buena práctica, pero es una realidad) .

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
(use --cached to keep the file, or -f to force removal)
[~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
rm 'shop/mickey/mtt_flange_SCN.7z.003'
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
#   modified:   shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
rm 'shop/mickey/mtt_flange_SCN.7z.002'
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.002
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
[~/www]$

Actualización: esta respuesta está obteniendo algo de tráfico, así que pensé que mencionaría mi otra respuesta de Git que comparte un par de excelentes recursos: esta página tiene un gráfico que me ayuda a desmitificar a Git. El libro "Pro Git" está en línea y me ayuda mucho.

Chris K
fuente
66
Luego, necesitaría confirmar esto con algo así git commit -m "Just removing file1.txt"y luego, si tiene un repositorio remoto, presione el compromiso con algo como git push origin master.
prohibición de geoingeniería
77

Primero, si está utilizando git rm, especialmente para múltiples archivos, considere que cualquier comodín será resuelto por el shell, no por el gitcomando.

git rm -- *.anExtension
git commit -m "remove multiple files"

Pero, si su archivo ya está en GitHub, puede (desde julio de 2013) eliminarlo directamente de la GUI web.

Simplemente vea cualquier archivo en su repositorio, haga clic en el ícono de la papelera en la parte superior y confirme la eliminación como cualquier otra edición basada en la web.

Luego " git pull" en su repositorio local, y eso también eliminará el archivo localmente.
¿Qué hace que esta respuesta sea una forma (indirecta) de eliminar un archivo de git repo?
(Sin mencionar que un archivo en GitHub está en un "repositorio de git")


botón de borrar

(la confirmación reflejará la eliminación de ese archivo):

cometer una eliminación

Y así como así, se fue.

Para obtener ayuda con estas características, asegúrese de leer nuestros artículos de ayuda sobre cómo crear , mover , renombrar y eliminar archivos.

Nota: Dado que es un sistema de control de versiones, Git siempre te respalda si necesitas recuperar el archivo más tarde.

La última oración significa que el archivo eliminado sigue siendo parte del historial y puede restaurarlo con bastante facilidad (pero aún no a través de la interfaz web de GitHub):

Consulte " Restaurar un archivo eliminado en un repositorio de Git ".

VonC
fuente
44
¡Tienes que desplazarte hasta la parte inferior y presionar "Confirmar cambios" para confirmar la eliminación!
LevinsonTechnologies
1
Esto no funciona para archivos de texto grandes. El servidor intenta procesar el archivo como en la captura de pantalla y luego falla con un error 500.
CapeCoder
99
Esta respuesta se refiere a github, la pregunta es sobre un repositorio git. No cómo usar la interfaz de github.
Peter Marshall
65

Esta es la única opción que funcionó para mí.

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'

Nota: Reemplace * .sql con su nombre de archivo o tipo de archivo. Tenga mucho cuidado porque esto pasará por cada confirmación y extraerá este tipo de archivo.

EDITAR: preste atención: después de este comando no podrá empujar o tirar, verá el rechazo de 'historial no relacionado', puede usar 'git push --force -u origin master' para empujar o tirar

Jason Glisson
fuente
99
Esta es una gran respuesta, pero tenga en cuenta que, a diferencia de las otras respuestas, este comando reescribe el historial de confirmación y elimina todo rastro de los archivos que coinciden con el patrón. Esto es particularmente útil si descubrió que accidentalmente confirmó cierta información confidencial (y, si es necesario, puede usar --force para reescribir el historial de cualquier repositorio remoto al que se haya enviado esto).
yoniLavi
3
Ese fue exactamente el problema que tuve y me tomó un poco de prueba y error para hacerlo bien. Un tipo con el que estaba trabajando había cometido varios volcados de bases de datos grandes en un repositorio que se remontaba a muchas confirmaciones. Por eso usé .sql en mi ejemplo. Mi repositorio estaba tan hinchado y grande que Github ya no aceptaba empujones.
Jason Glisson
3
Si está utilizando un maestro remoto, debe forzar un compromiso y empujarlo hacia arribagit push --force -u origin master
AlbertMarkovski
2
@AlbertMarkovski Lo siento, no fui específico. Github en realidad no aceptaría el impulso porque el repositorio estaba más allá de su límite de tamaño. Al menos varios GB. Me interrumpieron y me enviaron un correo electrónico al respecto. Entonces, desafortunadamente, ninguna cantidad de forzar un impulso ayudaría en ese punto.
Jason Glisson
2
@JasonGlisson También me enfrenté al problema de que un video se agregó a un repositorio por accidente.
AlbertMarkovski
34

Además, si se trata de una carpeta que se eliminará y se trata de carpetas o archivos secundarios posteriores, use:

git rm -r foldername
Raja
fuente
2
¡Esto elimina la carpeta del local también! Use git rm --cached -r <foldername>
Eje
24

De manera más general, git helpayudará con al menos preguntas simples como esta:

zhasper@berens:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]

The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index
James Polley
fuente
66
Para cosas más complejas, me parece git helpconfuso, pero es bueno para las cosas simples :)
James Polley
99
En realidad, no es tan bueno para git noobs porque "index" no es un concepto con el que git noobs esté familiarizado. Hablo por experiencia personal de ser un git noob :) Además, creo que es mucho menos confuso decir que rm organiza un archivo para su eliminación en lugar de eliminarlo del índice (aunque todavía no tiene sentido para los novatos).
Roman Starkov
De acuerdo con romkyns: la descripción "Eliminar archivos del árbol de trabajo y del índice" no me parece que sea una forma de eliminar el archivo del repositorio. Tal vez si entendiera git mejor lo haría. En su lugar, parece que estás sólo archivos de unstaging (y opcionalmente los sacan del árbol de trabajo - que podría afectar necesariamente el repositorio?)
Larsh
14

Si desea eliminar el archivo del repositorio, pero dejarlo en el sistema de archivos (no se rastreará):

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

Si desea eliminar el archivo del repositorio y del sistema de archivos, entonces hay dos opciones:

  1. Si el archivo no tiene cambios organizados en el índice:

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. Si el archivo tiene cambios organizados en el índice:

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    

fuente
12

git rm solo eliminará el archivo de esta rama de ahora en adelante, pero permanece en el historial y git lo recordará.

La forma correcta de hacerlo es con git filter-branch, como otros han mencionado aquí. Reescribirá cada confirmación en el historial de la rama para eliminar ese archivo.

Pero, incluso después de hacer eso, git puede recordarlo porque puede haber referencias a él en reflog, controles remotos, etiquetas y demás.

Si desea eliminarlo por completo en un solo paso, le recomiendo que use git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

Es fácil, solo hazlo git forget-blob file1.txt.

Esto eliminará cada referencia, hacer git filter-branchy finalmente ejecutará el recolector de basura git git gcpara deshacerse por completo de este archivo en su repositorio.

nachoparker
fuente
10

Otra forma si desea eliminar el archivo de su carpeta local usando el comando rm y luego enviar los cambios al servidor remoto.

rm file1.txt

git commit -a -m "Deleting files"

git push origin master
Suhaib
fuente
10

Nota: si desea eliminar el archivo solo de git, use a continuación:

git rm --cached file1.txt

Si desea eliminar también del disco duro:

git rm file1.txt

Si desea eliminar una carpeta (la carpeta puede contener pocos archivos), debe eliminarla utilizando el comando recursivo, como se muestra a continuación:

git rm -r foldername

Si desea eliminar una carpeta dentro de otra carpeta

git rm -r parentFolder/childFolder

Entonces, puedes commity pushcomo siempre. Sin embargo, si desea recuperar la carpeta eliminada, puede seguir esto: es posible recuperar archivos eliminados de git.

De doc:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

OPCIONES

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

puede necesitar escapar de ellos. Se puede asignar un nombre de directorio principal (por ejemplo, dir para eliminar dir / file1 y dir / file2) para eliminar todos los archivos del directorio y recursivamente todos los subdirectorios, pero esto requiere que la opción -r se especifique explícitamente. -f --force

Override the up-to-date check.

-n --dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

opciones de línea de comandos). --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

--no ignorar

Exit with a zero status even if no files matched.

-q --quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

Lea más en el documento oficial.

Blasanka
fuente
7

Para borrar un archivo específico

nombre de archivo git rm

Para limpiar todos los archivos no rastreados de un directorio de forma recursiva en un solo disparo

git clean -fdx

Sitesh
fuente
5

Si tiene la aplicación GitHub para Windows, puede eliminar un archivo en 5 sencillos pasos:

  • Haz clic en Sincronizar.
  • Haga clic en el directorio donde se encuentra el archivo y seleccione su última versión del archivo.
  • Haga clic en herramientas y seleccione "Abrir un shell aquí".
  • En el shell, escriba: "rm {filename}" y presione enter.
  • Compromete el cambio y resincroniza.
Jushusted
fuente
5

En mi caso, traté de eliminar el archivo en github después de algunas confirmaciones, pero guardar en la computadora

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git push --force -u origin master

y luego este archivo fue ignorado

OlegV
fuente
3
  1. Primero, elimine archivos del repositorio local.

    git rm -r Nombre de archivo

    o eliminar archivos solo del repositorio local pero del sistema de archivos

    git rm - Nombre de archivo en caché

  2. En segundo lugar, confirmar los cambios en el repositorio local.

    git commit -m "unwanted files or some inline comments"   
    
  3. Finalmente, actualice / envíe los cambios locales al repositorio remoto.

    git push 
    
Ajay Kumar
fuente
¿eliminaría esto todo lo relacionado con el archivo agregado y empujado accidentalmente?
bapors
1

Probé muchas de las opciones sugeridas y ninguna parecía funcionar (no enumeraré los diversos problemas). Lo que terminé haciendo, que funcionó, fue simple e intuitivo (para mí) fue:

  1. mover todo el repositorio local a otra parte
  2. clone el repositorio nuevamente desde el maestro a su unidad local
  3. vuelva a copiar los archivos / carpetas de su copia original en el n. ° 1 en el nuevo clon del n. ° 2
  4. asegúrese de que el archivo grande del problema no esté o esté excluido en el archivo .gitignore
  5. hacer lo habitual git add / git commit / git push
jacanterbury
fuente
1

Una vez que haya eliminado el archivo del repositorio git rm, puede usar BFG Repo-Cleaner para borrar completa y fácilmente el archivo del historial del repositorio.

glisu
fuente
0

Tengo archivos obj y bin que accidentalmente llegaron al repositorio y no quiero contaminar mi lista de 'archivos cambiados'

Después de notar que fueron al control remoto, los ignoré agregando esto a.gitignore

/*/obj
/*/bin

El problema es que ya están en el control remoto, y cuando se cambian, aparecen como modificados y contaminan la lista de archivos modificados.

Para dejar de verlos, debe eliminar toda la carpeta del repositorio remoto.

En un símbolo del sistema:

  1. CD a la carpeta repositorio (es decir C:\repos\MyRepo)
  2. Quiero eliminar SSIS \ obj. Parece que solo puede eliminar en el nivel superior, por lo que ahora necesita CD en SSIS: (es decir C:\repos\MyRepo\SSIS)
  3. Ahora escribe el conjuro mágico git rm -r -f obj
    • rm = eliminar
    • -r = eliminar recursivamente
    • -f = significa fuerza, porque realmente lo dices en serio
    • obj es la carpeta
  4. Ahora corre git commit -m "remove obj folder"

Recibí un mensaje alarmante que decía que 13 archivos cambiaron 315222 eliminaciones

Luego, como no quería tener que buscar la línea CMD, entré en Visual Sstudio e hice una sincronización para aplicarlo al control remoto

Nick.McDermaid
fuente
0

Si necesita eliminar archivos de una extensión determinada (por ejemplo, archivos compilados), puede hacer lo siguiente para eliminarlos todos a la vez:

git remove -f *.pyc
Sergi Ramón
fuente
0

De acuerdo con la documentación .

git rm --cached giant_file

Cuando se trata de datos confidenciales, es mejor no decir que eliminó el archivo, sino incluirlo en la última confirmación conocida:

0. Modificar el último compromiso

git commit --amend -CHEAD

Si desea eliminar el archivo de todo el historial de git, de acuerdo con la documentación , debe hacer lo siguiente:

1. Eliminarlo de su historial local

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. No olvide incluir este archivo en .gitignore (si es un archivo que nunca quiere compartir (como contraseñas ...):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3. Si necesita eliminar del control remoto

git push origin --force --all

4. Si también necesita eliminarlo de los lanzamientos de etiquetas:

git push origin --force --tags
Tomás Baran
fuente