La eliminación de múltiples archivos de un repositorio Git que ya han sido eliminados desde el disco

StackOverflow https://stackoverflow.com/questions/492558

Pregunta

Tengo un repositorio Git que me han eliminado cuatro archivos de uso rm (no git rm), y mi Git status se parece a esto:

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

¿Cómo puedo eliminar estos archivos desde Git sin tener que pasar manualmente a través de y añadir a cada archivo como este:

git rm file1 file2 file3 file4

Idealmente, estoy buscando algo que funciona de la misma manera que git add . no, si eso es posible.

¿Fue útil?

Solución

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 organizar solo la ruta actual:

$ git add -u .

Otros consejos

git ls-files --deleted -z | xargs -0 git rm 

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

Puedes usar

git add -u

Para agregar los archivos eliminados al área de ensayo, luego confirmelos

git commit -m "Deleted files manually"

Si simplemente ejecuta:

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. Entonces puede ejecutar & Quot; git commit & Quot; para comprobar ese cambio.

O, si ejecuta:

git commit -a

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

Actualizar : si solo desea agregar archivos eliminados, intente:

git ls-files --deleted -z | xargs -0 git rm
git commit

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 del comando addremove de hg (aunque la detección de movimiento es automática).

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 un uso posterior conveniente .

git rm test.txt

Antes o después de eliminar el archivo real.

Al usar git-add con las opciones '--todos' o '--actualizar' 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.

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 confirmará los archivos eliminados que se rastrearon.

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

Si esos son los únicos cambios, simplemente puede hacer

git commit -a

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

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.

git add -u

-u --actualizar Solo coincida 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 ninguno, el valor predeterminado es ". " ;; en otras palabras, actualice todos los archivos rastreados en el directorio actual y sus subdirectorios.

Esa solución simple funciona bien para mí:

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

Si desea agregarlo a su .gitconfig haga esto:

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

Entonces todo lo que tienes que hacer es ejecutar:

git rma
git ls-files --deleted -z | xargs -0 git rm --cached

Esto eliminará todos los archivos borrados que eran anteriores a seguimiento por git, así como controlar el caso de que los nombres de archivo tienen espacios en ellos.

Dependiendo de su POSIX variante, puede que necesite utilizar xargs -0 -r:esto hará que xargs correctamente la salida cuando la corriente nulo contenido.

EDITAR: --cached y --deleted las banderas se utilizan conjuntamente para proteger contra la eliminación accidental de archivos que no han sido eliminados.

Pruébalo.

-a
--all
Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected.

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

o

git add --all && git commit -m "Your commit"

Utilice -t para 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

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 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 " eliminado " en eso; 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 -v líneas.
  4. Pase los archivos a git rm.

Pegando esto en un alias de shell ahora ...

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 puede hacer

git reset HEAD <path>

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

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

git ls-files --deleted | xargs git rm

Probablemente también quiera comprometerse con un comentario.

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

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

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

Necesitaba lo mismo y usó git gui " escenario cambiado " botón. también agrega todo.

Y después de " la etapa cambió " Hice & Quot; commit & Quot; ...

para que mi directorio de trabajo vuelva a estar limpio.

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

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

Se requiere -u 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 add es buscar los archivos en el directorio de trabajo, y si especifica archivos que ha eliminado allí, no los encontrará.

algo así como

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

puede hacerlo.

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

(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
git rm $(git ls-files -d)

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top