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.



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 .

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í ...


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"

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

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).


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.


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.


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.


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.


29

Si esos son los únicos cambios, simplemente puede hacer

git commit -a

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


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.

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.


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


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

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.


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"

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


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

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 ...


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.


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

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


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.


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


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á.


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.


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

1

algo como

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

puede hacerlo


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


-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).


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
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.