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 conls-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:
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).
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 deDocumentation
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 deDocumentation/
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