Agregar archivos recursivamente por patrón

Resuelto Michel Krämer asked hace 14 años • 13 respuestas

¿Cómo agrego archivos de forma recursiva según un patrón (o global) ubicado en diferentes directorios?

Por ejemplo, me gustaría agregar A/B/C/foo.javay D/E/F/bar.java(y varios otros archivos java) con un comando:

git add '*.java'

Desafortunadamente, eso no funciona como se esperaba.

Michel Krämer avatar May 18 '10 14:05 Michel Krämer
Aceptado

Puede usarlo git add [path]/\*.javapara agregar archivos java desde subdirectorios,
por ejemplo , git add ./\*.javapara el directorio actual.

De git addla documentación :

Agrega contenido de todos *.txtlos archivos del Documentationdirectorio y sus subdirectorios:

$ git add Documentation/\*.txt

Tenga en cuenta que el asterisco *aparece entre comillas en el shell en este ejemplo; esto permite que el comando incluya los archivos de los subdirectorios del Documentation/directorio.

Sergey Glotov avatar Feb 24 '2012 14:02 Sergey Glotov

La respuesta de Sergio Acosta es probablemente su mejor opción si es posible que algunos de los archivos que se agregarán aún no hayan sido rastreados. Si desea limitarse a los archivos que git ya conoce, puede combinarlos git-ls-filescon un filtro:

git ls-files [path] | grep '\.java$' | xargs git add

Git no proporciona ningún mecanismo sofisticado para hacer esto por sí mismo, ya que es básicamente un problema de shell: ¿cómo se obtiene una lista de archivos para proporcionar como argumentos a un comando determinado?

Cascabel avatar May 18 '2010 13:05 Cascabel

Con zshpuedes ejecutar:

git add "**/*.java"

y todos sus *.javaarchivos se agregarán de forma recursiva.

Olivier Verdier avatar May 18 '2010 07:05 Olivier Verdier

La respuesta de Sergey (no me dé crédito) está funcionando:

You can use git add [path]/\*.java

con un git reciente:

$git version
git version 1.7.3.4

Archivos para la prueba:

$find -name .git -prune -o -type f -print | sort
./dirA/dirA-1/dirA-1-1/file1.txt
./dirA/dirA-1/dirA-1-2/file2.html
./dirA/dirA-1/dirA-1-2/file3.txt
./dirA/dirA-1/file4.txt
./dirB/dirB-1/dirB-1-1/file5.html
./dirB/dirB-1/dirB-1-1/file6.txt
./file7.txt

Estado de Git:

$git status -s
?? dirA/
?? dirB/
?? file7.txt

Agregando *.txt:

$git add \*.txt

Estado actualizado:

$git status -s
A  dirA/dirA-1/dirA-1-1/file1.txt
A  dirA/dirA-1/dirA-1-2/file3.txt
A  dirA/dirA-1/file4.txt
A  dirB/dirB-1/dirB-1-1/file6.txt
A  file7.txt
?? dirA/dirA-1/dirA-1-2/file2.html
?? dirB/dirB-1/dirB-1-1/file5.html
Alberto avatar Mar 14 '2012 19:03 Alberto