tipos tag qué existen etiquetas crear git glob filepattern

tag - qué tipos de etiquetas existen en git



Agregar recursivamente archivos por patrón (9)

Como se menciona en " git: ¿Cómo puedo agregar recursivamente todos los archivos en un subárbol de directorio que coincida con un patrón glob? ", Si escapa o cita adecuadamente su globing pathspec (como ''*.java'' ), entonces sí, git add ''*.java''

Git 2.13 (Q2 2017) mejora eso para agregar interactivo:

Ver commit 7288e12 (14 Mar 2017) por Jeff King ( peff ) .
(Fusionada por Junio ​​C Hamano - gitster - in commit 153e0d7 , 17 de marzo de 2017)

add --interactive : no expanda pathspecs con ls-files

Cuando queremos obtener la lista de archivos modificados, primero expandimos las tablas de acceso proporcionadas por el usuario con " ls-files " y luego alimentamos la lista resultante de rutas como argumentos para " diff-index " y " diff-files ".
Si su pathspec se expande en una gran cantidad de rutas, puede encontrarse con uno de dos problemas:

  1. El sistema operativo puede quejarse sobre el tamaño de la lista de argumentos y negarse a ejecutar. Por ejemplo:

    $ (ulimit -s 128 && git add -p drivers) Can''t exec "git": Argument list too long at .../git-add--interactive line 177. Died at .../git-add--interactive line 177.

Eso está en el repositorio de linux.git , que tiene unos 20K archivos en el directorio "drivers" (ninguno de ellos modificado en este caso). El truco " ulimit -s " es necesario para mostrar el problema en Linux incluso para un conjunto de rutas tan gigantesco.
Otros sistemas operativos tienen límites mucho más pequeños (por ej., Se vio un caso en el mundo real con solo archivos 5K en OS X).

  1. Incluso cuando funciona, es realmente lento. El código de pathspec no está optimizado para un gran número de rutas. Aquí está el mismo caso sin el ulimit:

    $ time git add -p drivers No changes. real 0m16.559s user 0m53.140s sys 0m0.220s

Podemos mejorar esto salteando " ls-files " por completo, y simplemente alimentando las samplespath originales a los comandos diff.

Históricamente, el lenguaje pathspec soportado por " diff-index " era más débil, pero ya no es el caso.

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

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

git add ''*.java''

Desafortunadamente, eso no funciona como se esperaba.


Con zsh puedes ejecutar:

git add "**/*.java"

y todos sus archivos *.java se agregarán recursivamente.


La respuesta de Sergio Acosta es probablemente la mejor opción si es posible que algunos de los archivos que se agregaron aún no se hayan rastreado. Si quiere limitarse a archivos que ya conoce, puede combinar git-ls-files con un filtro:

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

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


Puedes usar git add [path]//*.java para agregar archivos java desde subdirectorios,
por ejemplo, git add .//*.java para el directorio actual.

De la documentación de git add :

Agrega contenido de todos los archivos *.txt en el directorio de Documentation y sus subdirectorios:

$ git add Documentation//*.txt

Tenga en cuenta que el asterisco * se cita del shell en este ejemplo; esto permite que el comando incluya los archivos de los subdirectorios de Documentation/ directory.


Si ya está rastreando sus archivos y los ha modificado, y ahora quiere agregarlos selectivamente en función de un patrón, puede usar la bandera --modified

git ls-files --modified | grep ''<pattern>'' | xargs git add

Por ejemplo, si solo desea agregar los cambios de CSS a esta confirmación, puede hacer

git ls-files --modified | grep ''/.css$'' | xargs git add

Ver man git-ls-files para más banderas


Solo quería agregar archivos que tenían una determinada cadena basada en el git status :

git status | grep string | xargs git add

y luego pudo git commit -m ''commit msg para confirmar todos los archivos modificados con "string" en el título del archivo


Solo usa git add */*.java . Esto agregará todos los archivos .java en el directorio raíz y todos los subdirectorios.


Un poco fuera de tema (no específicamente relacionado con git) pero si estás en Linux / Unix, una solución podría ser:

find . -name ''*.java'' | xargs git add

Y si espera caminos con espacios:

find . -name ''*.java'' -print0 | xargs -0 git add

Pero sé que eso no es exactamente lo que preguntaste.


La respuesta de Sergey (no me acredite) 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

Agregar * .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