2012-03-02 27 views
15

¿Cómo puedo eliminar fácilmente varios archivos sin escribir manualmente las rutas completas de todos ellos al git rm? Tengo muchos archivos modificados que me gustaría conservar, por lo que tampoco es posible eliminar todos los modificados.¿Tiene varios archivos?

Y también es posible revertir los cambios de varios archivos sin escribir manualmente git checkout -- /path/to/file?

Respuesta

20

Puede asignar comodines al git rm.

p. Ej.

git rm *.c 

O puede simplemente escribir los nombres de todos los archivos en otro archivo, digamos filesToRemove.txt:

path/to/file.c 
path/to/another/file2.c 
path/to/some/other/file3.c 

puede automatizar esto:

Abrir el archivo y revisión los nombres (para asegurarse de que está bien).

continuación:

cat filesToRemove.txt | xargs git rm 

O:

for i in `cat filesToRemove.txt`; do git rm $i; done 

Compruebe la página del manual de xargs para más opciones (ESP si es demasiado muchos archivos.).

+0

Está en Windows y usa el shell de Windows. – jmlane

+0

Eso es demasiado complicado para algo que debería tomar aproximadamente 3 segundos. – Tower

+0

Básicamente es "git rm ..." y de alguna manera tienes que pasar todos los nombres de los archivos. A menos que leas tu mente, esta es la manera más rápida. – Manish

1

En los sistemas POSIX, puede crear un glob de shell que coincidirá con todos los archivos deseados, simplemente puede pasarlo a git rm y git checkout --. En Windows, cmd.exe y PowerShell no incluyen englobamiento y granja de las aplicaciones (git no lo hace para los archivos, por lo que he leído). Debería usar un comando o script de Windows para preparar una lista de archivos y canalizarla a sus comandos de git de manera apropiada para obtener un efecto similar.

Cualquier estrategia que utilizaría para pasar una lista de archivos a un comando de shell funcionará para los comandos de git que aceptan rutas de archivos.

+0

Um, ¿me puede mostrar un ejemplo, estoy en Windows? – Tower

+0

Oh, cmd.exe de Windows y PowerShell no hace globbing y git para Windows no incluye esta funcionalidad hasta donde yo sé porque rompería árbol/rama/commit globbing (o eso he leído). Tendría que explorar los métodos de shell de Windows para la coincidencia de ruta de archivo. – jmlane

9

Simplemente elimínelas utilizando cualquier otro método (Explorer, lo que sea), luego ejecute git add -A. En cuanto a revertir varios archivos, también puede verificar un directorio.

+1

El método más fácil en esta página. – Jon

+0

Vine aquí buscando una manera más fácil que el explorador. si puedo encontrar todos los archivos que quiero eliminar usando la búsqueda recursiva en bash, prefiero no tener que hacer esto en el explorador y volver a git bash para completarlo. algo así como _almost_ works encontrar. -name "* debug *" -exec bash -c 'file = {}; git rm $ file '\; solo está usando rutas relativas –

0

También puede consultar Cygwin, ya que proporciona gran parte de la funcionalidad Unix/Linux/* BSD en Windows. Cygwin incluye un shell Bash y find (1), entre otras herramientas mencionadas anteriormente. (Por lo general tienen 2-4 terminales Cygwin mintty hasta en un momento en Windows 7 porque me parece que Cygwin práctico.)

1

Para la eliminación de múltiples archivos a la vez, es posible que desee a la caja de la respuesta here

Puede eliminar los archivos que no desee y ejecute este comando: git rm $(git ls-files --deleted)

0

simplemente puede usar:

git add -u 
+2

Por favor, agregue más detalles a su respuesta. – Jayan

0

he encontrado git rm 's manejo de comodines molestos. Buscar puede hacer el truco en una línea: find . -name '*.c' -exec git rm {} \; {} es donde se sustituirá el nombre del archivo.Lo bueno de find es que puede filtrar en una gran variedad de atributos de archivo no solo el nombre.

0

En Windows 10, usando Git Bash, desde la ubicación .gitignore en su estructura de archivos.

git rm -r --cached some_directory/ 

Acabo de utilizar esto para ignorar todo un directorio, recursivamente. Esto es lo que está en mi archivo .gitignore para esto:

# Use .gitignore to ignore a directory and its contents # 
/some_directory/