2010-11-10 14 views
6

Al usar "git add" con un patrón de archivo, solo agrega recursivamente los archivos sin seguimiento e ignora los cambiados a menos que estén en la carpeta actual.¿Es correcto el comportamiento de este git para "git add" con subcarpetas?

Ejemplo:

$ git status 
# On branch master 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: level1/test1.txt 
#  modified: level1/level2/test1.txt 
# 
# Untracked files: 
# (use "git add <file>..." to incldude in what will be committed) 
# 
#  level1/test2.txt 
#  level1/level2/test2.txt 
no changes added to commit (use "git add" and/or "git commit -a") 
$ git add level1\*.txt 
$ git status 
# On branch master 
# Changes to be committed: 
#  new file: level1/level2/test2.txt 
#  new file: level1/test2.txt 
# 
# Changed but not updated: 
#  modified: level1/level2/test1.txt 
#  modified: level1/test1.txt 
# 

Después ejecuto git add level1\*.txt, se añaden los archivos (test2.txt) sin seguimiento, pero no los archivos modificados (Test1.txt). Intenté con la opción -u, escapé y no escapé del asterisco, etc. pero nada parece ser capaz de agregar TODOS los archivos que coincidan con un patrón, ya sea que estén rastreados o no.

Por supuesto en este ejemplo, podría simplemente agregar todos los archivos con -A, pero tenga en mente que esto es solo para esta pregunta, en realidad habrá más archivos y no me gustaría agregarlos todos , y la jerarquía es algunas carpetas más profundas. La única forma de que agregue los archivos rastreados es referirme a dirigir o escribir todo el patrón, excepto por el nombre del archivo como este: git add level1**.txt O git add level1/level2/*.txt.

En el git agrega documentación: here dice que se supone que el patrón de archivos funciona recursivamente y no dice nada sobre archivos rastreados o no rastreados e incluso da y ejemplo.

Estoy usando msysgit pero he probado esto en Windows y Linux por si acaso.

Solo quiero saberlo. ¿Estoy interpretando la documentación correctamente (porque creo que según los documentos debería funcionar) o es así como se supone que funciona? Simplemente no tiene sentido para mí.

+0

A menos que esté malentendido su configuración o problema, no puedo reproducir esto en absoluto. Me configuré para obtener resultados del estado de git exactamente como el tuyo, luego ejecuté 'git add level1/*. Txt', y como se esperaba, se agregaron level1/test1.txt y level1/test2.txt (uno modificado, uno nuevo), pero no los dos archivos en level2. (¿Esperabas que coincidiera con los archivos en el nivel 2? El '*' no funciona en todos los directorios.) – Cascabel

+2

De acuerdo, creo que encontré lo que quieres decir. Si ejecuto 'git add" level1/* .txt "' (las comillas hacen que '' '' sea manejado por git, no por el shell), obtengo su comportamiento: se agregan los archivos test2 (nuevos), pero no el test1 (modificado). Interesante. (Leí mal la primera vez - pensé que el '\' era un separador de directorios de Windows. No uso msysgit.) – Cascabel

+0

(Er, en ese comentario anterior, '\' debería haber sido '\\ '.) He editado la pregunta para que sea un poco más clara con el ejemplo, después de reproducir esto yo mismo.Si he estropeado algo (en particular para hacer con separadores de directorios vs escapes de barras invertidas) por favor, ¡arréglenlo! – Cascabel

Respuesta

1

Bien, bien podría haber una respuesta a esta pregunta.

No, eso no parece ser el comportamiento correcto en absoluto. git add <filepattern> debe ser equivalente a git add file1 file2..., donde esos son los archivos que coinciden con el patrón, y eso no es lo que sucede aquí.

0

Esto se debe a que utiliza

git add level1\*.txt 

Toma nota de la barra invertida \. Esto es igual a

git add 'level1*.txt' 

Para obtener el comportamiento esperado, el uso slash /.

Si lo que desea es añadir todos los archivos, utilice git add -A .

+0

Como un usuario de git bastante experimentado, diría que este es un comportamiento inesperado. –

+0

Con "git add level1/*. Txt", se agregarán todos los archivos que terminen en ".txt" dentro de la carpeta level1, pero no los que están en sus subcarpetas como level2. Soy consciente de que puedes simplemente agregar todos los archivos con "git add -A", pero ese no es el punto aquí, queremos que el funcione como se espera (para unir todos los archivos con un patrón ...). – bluediapente