Encuentre el último file (s) agregado (s) a un repository de git con nombre (s) que coincidan con un patrón de comodín dado

Estoy buscando en el repository de git de un proyecto bastante grande cuyo banco de testings está salpicado en varios files en varios subdirectorys. Todos los nombres de file de caso de testing siguen el mismo patrón de comodín (por ejemplo, test-* ). Teniendo esto en count, ¿cómo puedo enumerar los casos de testing más nuevos comprometidos con el repository?

No soy muy específico acerca de si los commits crean un caso de testing o si modificaron por última vez un caso de testing. Cualquiera esta bien. Solo quiero ver algunas de las testings más nuevas escritas / modificadas por los queueboradores del proyecto.

Por lo que puedo entender:

 git log -- */test* 

Solo los shows comprometen los casos de testing táctica un nivel inferior en la jerarquía, y no más bajo.

Si */test* coincide con algún file (s), su shell expandirá esta expresión. Tratar:

 echo */test* 

en el indicador de shell. Compare, por ejemplo:

 $ cd /tmp $ mkdir empty $ cd empty $ echo */test* */test* 

/tmp/empty está vacío, entonces */test* no coincide con nada. Pero entonces:

 $ mkdir dir; touch dir/test.file $ echo */test* dir/test.file 

Entonces, si no tiene nada que coincida con */test* y se ejecuta:

 $ somegitcommand */test* 

el command git verá */test* como su argumento; pero si tiene algo que coincida, el command git verá dir/test.file como su argumento. Los * s han desaparecido.

La solución es súper simple: cita la parte */test* :

 $ git log --oneline -- '*/test*' 

Ahora git log verá */test* , en lugar de dir/test.file , y git podrá hacer coincidencias recursivas.


Vale la pena mencionar que no todas las conchas se comportan de la misma manera. En csh y tcsh, si no hay coincidencias para un comodín como */test.* , Obtienes:

 > rm -r dir > echo */test* echo: No match. 

En bash, puedes elegir el comportamiento:

 bash$ echo */test* */test* bash$ shopt -s failglob bash$ echo */test* bash: no match: */test* 

(De hecho, puede hacer lo mismo en csh y tcsh; está invertido: set nonomatch y el */test* se transfiere al echo ).

Además, esto ilustra la diferencia entre el globbing comodín del shell (que no se repite en subdirectorys) y git (que lo hace). Ver la respuesta de Jubobs e intentar (en el shell) echo */*/test* vs echo */test* (todo sin comillas). Algunas shells tienen globbing recursivo que se pueden habilitar de varias maneras, como usar ** para indicar que se desea la recursión: echo **/test* .


Una última nota: la coincidencia de comodines de git ha cambiado algo de una versión a otra, especialmente en files .gitignore . Específicamente, ** significa "cero o más directorys" (específicamente en files .gitignore ) se agregó a git en la versión 1.8.2 .

Descargo de responsabilidad : Esta no es la image completa; Solo dejo esta respuesta en vivo porque torek hace reference a ella en su respuesta mucho más completa .

Uso Git 2.0.1 en bash, y no puedo reproducir el comportamiento que describes: como se demuestra a continuación,

 git log -1 -- */test* 

muestra confirmaciones que agregan / eliminan / modifican files que coinciden con la test* dos niveles en la jerarquía del tree de trabajo. Quizás la manera en que se manejan los patrones glob cambió entre v1.8.3 y v2.0.1. Considere actualizar a una versión más reciente.

 # set things up cd ~/Desktop mkdir babyexample cd babyexample git init # add three test files under foo/bar/ mkdir foo cd foo mkdir bar cd bar touch test1.py touch test2.c touch testmypatience.baz cd ../.. git add . git commit -m "add three test files" # add a README touch README.md git add README.md git commit -m "add README" # remove test1.py git rm foo/bar/test1.py git commit -m "remove Python file" # modify test2.c printf "hello\n" > foo/bar/test2.c git add test2.c git commit -m "say hello in C file" 

Entonces,

 git log --oneline 

salidas

 9537199 say hello in C file 20b90f2 remove Python file 494cf11 add README bfb6686 add three test files 

mientras

 git log --oneline -- */test* 

filtra el resultado del logging como se esperaba:

 9537199 say hello in C file 20b90f2 remove Python file bfb6686 add three test files 

Use git diff para listr todas las tests recientemente cambiadas:

 git diff --stat HEAD^ -- '**/test*' path/to/test_x | 17 ----------------- path/to/test_y | 1 + 2 files changed, 1 insertions(+), 17 deletions(-)