Eliminar varios archivos de un repositorio de Git que ya se han eliminado del disco

1311

Tengo un repositorio de Git que eliminé cuatro archivos del uso rm( no git rm ), y mi estado de Git se ve así:

#    deleted:    file1.txt
#    deleted:    file2.txt
#    deleted:    file3.txt
#    deleted:    file4.txt

¿Cómo elimino estos archivos de Git sin tener que pasar manualmente y agregar cada archivo de esta manera?

git rm file1 file2 file3 file4

Idealmente, estoy buscando algo que funcione de la misma manera que lo git add .hace, si eso es posible.

Codebeef
fuente
10
@seth, no siempre es conveniente usarlo git rm, la eliminación podría haber sido desde una herramienta separada, IDE o administrador de archivos. Visual Studio para uno puede ser una molestia al eliminar / renombrar archivos.
Brett Ryan
67
Ugh, preguntar por qué alguien no usa git rmes un poco como preguntar por qué no usa git vimo git cd. Es algo estúpido tener que hacer, y git debería tener un comando o alias incorporado para eliminar los archivos eliminados de la puesta en escena, y no debería tener que buscarlo en SO o leer páginas de manual en su hora de almuerzo.
WCWedin
77
La respuesta de Varinder no es una buena manera. Considere git add -u como sugirió Cody y que también es la respuesta a esta pregunta: stackoverflow.com/questions/1402776/…
Roland

Respuestas:

2300

Para Git 1.x

$ git add -u

Esto le dice a git que organice automáticamente los archivos rastreados, incluida la eliminación de los archivos rastreados previamente.

Para Git 2.0

Para organizar todo su árbol de trabajo:

$ git add -u :/

Para representar solo la ruta actual:

$ git add -u .
carl
fuente
133
Tenga en cuenta que esto agregará todos los archivos rastreados y modificados, eliminados y actualizados.
Ian Hunter
19
@beanland, solo necesita proporcionar la ruta al archivo específico que desea modificar si no desea que los obtenga a todos. por ejemplo, git add -u [ruta]
Paul Prewett
27
también git add -u folder/para ejecutar esta operación en una carpeta
c ..
2
FYI: esta respuesta se fusionó de stackoverflow.com/questions/1402776/…
Shog9
1
Podría ser la pregunta que la gente estaba haciendo cuando llegaron a esta página, y podría ser lo que el OP realmente quería hacer, pero no responde la pregunta exacta formulada.
Relequestual
1362
git ls-files --deleted -z | xargs -0 git rm 

podría ser lo que estás buscando ... funciona para mí ...

Varinder
fuente
55
para Windows intente agregar el siguiente alias en su configuración sin las comillas como se indicó anteriormente por Evan Moran 'remove =! git ls-files --deleted -z | xargs -0 git rm '
CLS
21
tenga cuidado con los archivos con espacios en su nombre
maazza
44
@DaveEverittgit ls-files --deleted -z | xargs -0 git rm
Max Nanasy
15
git add -u, como sugirió Cody, es una forma mucho más simple y segura, sin riesgo de eliminar archivos accidentalmente.
Roland
44
Desestimar esto, ya que es la respuesta incorrecta, incluso si podría funcionar para algunos archivos. use "git add -u" a continuación. Para eso es.
n13
733

Puedes usar

git add -u

Para agregar los archivos eliminados al área de ensayo, luego confírmelos

git commit -m "Deleted files manually"
Cody Caughlan
fuente
101
Tenga en cuenta al usuario de Google: también agrega los archivos rastreados modificados al área de preparación.
Erenon 01 de
44
Ejecute este comando solo si acaba de eliminar los archivos y desea organizarlos de inmediato.
Aryo
1
no puedo eliminar el archivo del repositorio de bitbucket]
srinivas gowda
356

Si simplemente ejecutas:

git add -u

git actualizará su índice para saber que los archivos que ha eliminado deberían formar parte de la próxima confirmación. Luego puede ejecutar "git commit" para registrar ese cambio.

O, si corres:

git commit -a

Tomará automáticamente estos cambios (y cualquier otro) y los confirmará.

Actualización : si solo desea agregar archivos eliminados, intente:

git ls-files --deleted -z | xargs -0 git rm
git commit
Emil Sit
fuente
1
Bien, git commit -aharé lo que quiera, excepto que en algunos casos tengo archivos que no quiero comprometer, así que quiero preparar el compromiso manualmente.
Igor Zevaka
2
commit -a esencialmente hace un "add -u" primero; actualizará el índice con cualquier cambio en los archivos conocidos (ya sean eliminaciones o cambios simples). Por supuesto, puede ser más específico y agregar / rm solo los archivos que desee. git.or.cz/gitwiki/… puede ser útil.
Emil Sit
2
El conjunto de comandos debajo de "Actualizar: .." funcionó de maravilla. ¡Gracias!
Jay Taylor
10
Muchas gracias por 'git ls-files --deleted | xargs git rm '!
mit
18
"git ls-files --deleted | xargs git rm" es la respuesta correcta! ¡Gracias!
reto
166

Probablemente estés buscando -A:

git add -A

Esto es similar a git add -u, pero también agrega nuevos archivos. Esto es aproximadamente el equivalente al addremovecomando de hg (aunque la detección de movimiento es automática).

Dustin
fuente
8
En una nota lateral rápida, el uso de -u limita la adición a los archivos rastreados y -a también incluirá los archivos no rastreados. Solo pensé en señalar la diferencia.
spaaarky21
En esta etapa, también puede agregar todo a través del commit -a flag.
Zac Grierson
94

Para organizar solo los archivos eliminados :

for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done

O (la forma xargs):

git status | awk '/deleted/ {print $2}' | xargs git rm

Puede alias su conjunto de comandos preferido para su uso posterior conveniente.

Saeb Amini
fuente
2
@Saeb Entender acerca de la cola, pero xargsson unos 15 minutos para dominar.
Eric Wilson
11
git status | awk '/deleted/ {print $3}' | xargs git rmsería una forma más corta de hacerlo. grep | awk... Solo diga No.
Mark Reed
58
git rm $(git ls-files --deleted)No es esto más conveniente (copiado de esto ).
Hotschke
1
xargs o la sustitución $ () anterior si sabe que la lista no es enorme. Si la lista es enorme: git ls-files --deleted | while read f; do git rm $f; done
Andrew
2
@Andrew xargses probablemente más eficiente que un ciclo while para una lista enorme, ya que pasa más de un argumento cada vez que se ejecuta git rm. Para limitar el número de argumentos pasados git rmcada vez que se ejecuta, use la -nopción:git ls-files --deleted | xargs -n 15 git rm
Ajedi32
61
git rm test.txt

Antes o después de eliminar el archivo real.

Pico
fuente
77
Si bien funcionará, a menudo me encuentro eliminando una tonelada de archivos rmy lamentando más tarde.
carl
44
¿Por qué es esto peor que hacerlo git add -u? Parece que sería más seguro agregar los archivos específicos que se eliminaron al commit, en lugar de agregar TODOS los cambios.
Ian Dunn
2
en realidad esta debería ser la mejor respuesta de acuerdo con la última línea de la pregunta "Solo quiero un comando que elimine todos los archivos de git que también se eliminan del disco".
Ramsharan
2
@Ramsharan no, porque no hace eso en absoluto. Esto elimina un solo archivo; El OP solicitó ESPECÍFICAMENTE "todos" los archivos eliminados.
Adam
1
@Ramsharan no, ese es el punto: en casi todos los casos NO PUEDES usar un comodín (no hay comodín que coincida). Esta es la razón por la cual la respuesta principal es mucho más complicada.
Adam
49

Al usar git-add con las opciones '--todos' o '--update' puede obtener más de lo que desea. Los archivos nuevos y / o modificados también se agregarán al índice. Tengo una configuración de bash alias para cuando quiero eliminar archivos eliminados de git sin tocar otros archivos:

alias grma='git ls-files --deleted -z | xargs -0 git rm'

Todos los archivos que se han eliminado del sistema de archivos se agregan al índice como eliminados.

zobie
fuente
39

No es que realmente importe, pero no estoy de acuerdo con la respuesta elegida:

git add -u 

... eliminará los archivos del índice si se han eliminado los archivos correspondientes en el árbol de trabajo, pero también organizará los nuevos contenidos modificados de los archivos rastreados.

git rm $(git ls-files --deleted)

... por otro lado, solo rm los archivos eliminados que fueron rastreados.

Entonces, este último en mi opinión es la mejor opción.

Stephan Tual
fuente
29

Si esos son los únicos cambios, simplemente puede hacer

git commit -a

para cometer todos los cambios. Eso incluirá archivos eliminados.

SpoonMeiser
fuente
3
No estoy seguro de por qué me votaron en contra; git hace un buen trabajo al identificar archivos que han sido eliminados, incluso si no lo ha dicho explícitamente usando git rm.
SpoonMeiser
Usted fue rechazado porque "-a" no es un cambio aceptable, es "-A". Editando tu respuesta.
Sheharyar
10
No, "-a" es un modificador aceptable, porque el comando es commit . "-A" es un interruptor para agregar pero no confirmar . Veo que su edición sugerida ya ha sido rechazada.
SpoonMeiser
En caso de que lo único que esté confirmando sea el archivo eliminado, agregue el interruptor --allow-empty
billrichards el
err, en realidad --allow-empty solo es necesario si hiciste git rm --cached
billrichards
20
git ls-files --deleted | xargs git rm 

es la mejor opción para agregar solo archivos eliminados.

Aquí hay algunas otras opciones.

git add .  => Add all (tracked and modified)/new files in the working tree.

git add -u => Add all modified/removed files which are tracked.

git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree.

git commit -a -m "commit message" - Add and commit modified/removed files which are tracked.
Sijo Kurian
fuente
16

git add -u

-u --update Solo coincide con archivos ya rastreados en el índice en lugar del árbol de trabajo. Eso significa que nunca organizará nuevos archivos, sino que organizará nuevos contenidos modificados de archivos rastreados y que eliminará archivos del índice si se han eliminado los archivos correspondientes en el árbol de trabajo.

Si no se proporciona, el valor predeterminado es "."; en otras palabras, actualice todos los archivos rastreados en el directorio actual y sus subdirectorios.

Obay
fuente
La respuesta más votada ya dice usar git add -u. ¿De dónde vienen todas las otras cosas en su respuesta, la documentación? Debe vincular a la documentación y citarla en bloque si es así.
TheWarriorNamedFoo
14

Esa solución simple funciona bien para mí:

git rm $(git ls-files --deleted)
Houssem Badri
fuente
Creo que siempre debe usar git shell en su directorio de trabajo actual
Houssem Badri
2
Esto es agradable y simple, pero no funciona con carpetas recursivas.
DrB
@BehnazChangizi Creo que sí, stackoverflow.com/questions/1054044/…
Houssem Badri
@PvdL no acepta espacios en la ruta es un problema os-specefic
Houssem Badri
11

Si desea agregarlo a su .gitconfighacer esto:

[alias]
  rma = !git ls-files --deleted -z | xargs -0 git rm

Entonces todo lo que tienes que hacer es correr:

git rma
Evan Moran
fuente
1
y desde la línea cmdgit config --global alias.rmd '!git ls-files --deleted -z | xargs -0 git rm'
Casey
9
git ls-files --deleted -z | xargs -0 git rm --cached

Esto eliminará todos los archivos eliminados que git rastreó anteriormente, y manejará el caso en el que los nombres de los archivos tienen espacios en ellos.

Dependiendo de su variante POSIX, es posible que necesite usar xargs -0 -r: esto causaráxargs que salga con gracia cuando se canalice contenido nulo.

EDITAR: --cachedy las --deletedbanderas se usan en conjunto para proteger contra la eliminación accidental de archivos que aún no se han eliminado.

Murphy Danger
fuente
7

Dígale al comando que organice automáticamente los archivos que se han modificado y eliminado, pero los archivos nuevos que no le ha dicho a Git no se ven afectados:

-a
--todos

git add . && git commit -m -a "Your commit"

o

git add --all && git commit -m "Your commit"
ilgam
fuente
1
git add --all && git commit -m "Your commit" Esto funcionó para mí en windows-7, utilizando el shell de comandos de Git bash.
kmarabet
1
El siguiente comando funcionó para mí en Windows-7, usando el shell de comandos de Git bash: $ git add --all && git commit -m "eliminar archivos de propiedades" [master 58c41ac] eliminar archivos de propiedades 1 archivo cambiado, 9 eliminaciones (-). .. Luego, para impulsar los cambios confirmados en el repositorio remoto, ejecute: $ git push origin . Contando objetos: 10, hecho.
kmarabet
6

Lo siguiente funcionará, incluso si tiene muchos archivos para procesar:

git ls-files --deleted | xargs git rm

Probablemente también quieras comprometerte con un comentario.

Para más detalles, consulte: Scripts útiles de Git

l3x
fuente
6

Utilice -tpara ver qué comando se está ejecutando realmente

Acabo de ajustar la respuesta de Virender para hacer lo mismo:

git ls-files --deleted -z | xargs -t -0 git rm
Venkateswara Rao
fuente
5

Ninguno de los indicadores de git-add solo organizará los archivos eliminados; si todo lo que ha modificado son archivos eliminados, entonces está bien, pero de lo contrario, debe ejecutar git-status y analizar la salida.

A partir de la respuesta de Jeremy, esto es lo que obtuve:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. Obtener el estado de los archivos.
  2. Para los archivos eliminados, aísle el nombre del archivo.
  3. Elimine todas las líneas que comienzan con #s, así como una línea de estado que tenía la palabra "borrado"; No recuerdo exactamente qué era, y ya no está allí, por lo que es posible que tenga que modificar esto para diferentes situaciones. Creo que la agrupación de expresiones podría ser una característica específica de GNU, por lo que si no está utilizando gnutils, es posible que deba agregar varias grep -vlíneas.
  4. Pase los archivos a git rm.

Pegando esto en un alias de shell ahora ...

Xiong Chiamiov
fuente
5

Como se mencionó

git add -u

organiza los archivos eliminados para su eliminación, PERO TAMBIÉN modifica los archivos para su actualización.

Para desestabilizar los archivos modificados que puedes hacer

git reset HEAD <path>

si desea mantener sus compromisos organizados y limpios.
NOTA: Esto también podría desestabilizar los archivos eliminados, así que tenga cuidado con esos comodines.

Neurona Oscura
fuente
4
git commit -m 'commit msg' $(git ls-files --deleted)

Esto funcionó para mí después de que ya había eliminado los archivos.

Chad
fuente
3

Necesitaba lo mismo y utilicé el botón "etapa cambiada" de git gui. También agrega todo.

Y después de "cambio de escenario" hice "commit" ...

entonces mi directorio de trabajo está limpio nuevamente.

Serdar
fuente
Bueno, usar una GUI es engañar, ¡jaja! Pero más rápido en los casos en que el diseñador de GUI cubrió sus necesidades. Es bueno saber cómo jugar con "lo que hay debajo del capó".
Dennis
1
FYI: esta respuesta se fusionó de stackoverflow.com/questions/1402776/…
Shog9
3
git rm $(git ls-files -d)

Elimina todos los archivos enumerados por el git ls-filescomando (-d mostrar solo archivos eliminados). No funciona para archivos con espacios en el nombre de archivo o ruta, pero es fácil de recordar

A. Albershteyn
fuente
2

Puede usar git add -u <filenames>para organizar solo los archivos eliminados.

Por ejemplo, si eliminó los archivos templates/*.tpl, usegit add -u templates/*.tpl .

Se -urequiere para hacer referencia a los archivos que existen en el repositorio pero que ya no existen en el directorio de trabajo. De lo contrario, el valor predeterminado de git addes buscar los archivos en el directorio de trabajo, y si especifica los archivos que ha eliminado allí, no los encontrará.

thomasrutter
fuente
2

Agregar alias del sistema para organizar archivos eliminados como comando rm-all

UNIX alias rm-all='git rm $(git ls-files --deleted)'

Ventanas doskey rm-all=bash -c "git rm $(git ls-files --deleted)"

Nota

Windows necesita tener bashinstalado.

Haris Krajina
fuente
2

(Otra variación más)

Quería eliminar todos los archivos ya eliminados de los discos pero de una carpeta específica, dejando intactas las otras carpetas. Lo siguiente funcionó para mí:

git ls-files --deleted  | grep <folder-name> | xargs git rm
urbano
fuente
1

algo como

git status | sed -s "s/^.*deleted: //" | xargs git rm 

puede hacerlo

Jeremy French
fuente
2019 git versión 2.13.3:git diff --diff-filter=D --name-only | xargs git rm
user151841
1

Para proyecto de estudio visual

'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm' 

que es útil cuando la ruta del archivo eliminado tiene espacio

Aserrador
fuente
-1

La solución más flexible que he encontrado hasta la fecha es

git cola

Y seleccione todos los archivos eliminados que quiero poner en escena.

(Tenga en cuenta que generalmente hago todo lo de la línea de comandos en git, pero git maneja los archivos eliminados un poco incómodo).

Broes De Cat
fuente
Los comodines no funcionaban para mí, git add -u path/to/my/deleted-files-pattern-*.ymlasí que esta fue la mejor respuesta para mí (no querer organizar todos los archivos eliminados, sino 50 de un par de cientos).
mlncn