2012-08-15 13 views
7

Quiero agregar un archivo que tiene un nombre de archivo exclusivo pero una ruta anterior larga (por ejemplo, a/b/c/d/filename.java). Normalmente agregaría esto a mi repositorio haciendoUso de dos asteriscos para agregar un archivo en git

git add *filename.java.

Sin embargo, también han hecho esto antes:

git add a/b/c/d/filename*

así que traté de combinar los dos:

git add *filename*

pero esto hace algo raro. Agrega todos los archivos sin seguimiento. Puedo ver posibles motivos de falla, pero todos deberían ocurrir en uno de los dos comandos anteriores, así que no sé por qué sucede esto.

Mi pregunta no es tanto acerca de cómo agregar un archivo a un repositorio de git con solo su nombre de archivo (aunque sería útil). Mi pregunta es cuál es mi malentendido de la operación * que me hace pensar que lo anterior debería funcionar.

Info:

estoy usando Git Bash for Windows, que se basa en minGW.

+0

¿El nombre del archivo que está utilizando en realidad es la cadena 'filename' o lo está utilizando como ejemplo? – Hogan

+0

Eso es solo un ejemplo. – Paul

+0

Si se refiere al último comando, entonces eso no es lo que está sucediendo. De hecho, creo que está sucediendo todo lo contrario: está combinando todo. Si escribo 'git add', entonces no se agrega nada. – Paul

Respuesta

9

Estás viendo globs (no son expresiones regulares, que son un lenguaje de coincidencia de patrones diferente), y están expandidos por tu shell, no por git.

Si desea ver cómo van a coincidir, simplemente pase el mismo globo a otro comando, por ej.

$ ls -d *filename.java 

vs

$ ls -d *filename* 

(me acaba de añadir la -d por lo ls no muestra el contenido de todos los directorios que coincidan)


Puesto que usted está utilizando git bash, y es posible que la expansión glob se comporte de forma diferente a un shell normal, intente

$ git add --dry-run --verbose -- *filename* 

por ejemplo: esto debería mostrarle cómo realmente se expande el globo y qué efecto tiene.

Nota del -- ... si está utilizando globos que podría coincidir con un nombre de archivo con un líder -, es importante asegurarse de Git sabe que es un nombre de archivo y no una opción.

Desafortunadamente, esto solo le mostrará los archivos que coincidan con el glob y tendrán alguna diferencia entre el índice y la copia de trabajo.


respuesta del autor: El simulacro ha ayudado mucho, esto es lo que encontré:

me olvidaba sobre la carpeta bin que no he añadido, por lo que cuando realizó la En seco me di cuenta de que estaba encontrando dos coincidencias: filename.java y filename.class. Cuando cambié el glob a *filename.j* funcionó.

Mi siguiente paso fue eliminar .class y probar el comando nuevamente: ¡funcionó! Todavía no se sabe por qué git bash agregó todo cuando encontró dos coincidencias ... ya que la carrera en seco se comporta de manera diferente a la actual, creo que debe haber un error, pero creo que la discusión se realizará en otro lado (a menos que alguien lo piense no es un error).

+0

Curiosamente, esto me da resultados diferentes. Entonces, ¿esto significa que Git lo está evaluando? – Paul

+0

Git no puede evaluarlo, Globing sucede antes de ejecutar Git (en todos los shells que conozco) – Hogan

+0

Ese podría ser el problema: estoy usando Git Bash, que es un shell de Git para Windows (que creo que usa minGW). Agregaré esto a mi primera publicación. – Paul

Cuestiones relacionadas