¿Cómo agrego recursivamente archivos por 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 comando:
git add '*.java'
Desafortunadamente, eso no funciona como se esperaba.
git
glob
filepattern
Michel Krämer
fuente
fuente
.java
archivos (ya rastreados) en su directorio actual, es posible que se encuentre con, por ejemplo, un complicado manejo de comodines entre bash y el "ayudante" de la línea de comandos de msys . No estoy seguro de una solución. Puede probar varias capas de comillas:git add '"*.java"'
( bash toma las comillas simples para evitar la expansión global, las comillas dobles las toma la capa msys para evitar la expansión global).git add *.java
funciona para mí (en PowerShell con el cliente GitHub)Respuestas:
La respuesta de Sergio Acosta es probablemente su mejor opción si algunos de los archivos que se van a agregar pueden no ser rastreados. Si desea limitarse a los archivos que ya conoce git, puede combinarlos
git-ls-files
con un filtro: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 dado?
fuente
git ls-files -co --exclude-standard | grep '\.java$' | xargs git add
Puede usar
git add [path]/\*.java
para agregar archivos Java desde subdirectorios,por ejemplo ,
git add ./\*.java
para el directorio actual.De la
git add
documentación :fuente
Con
zsh
usted puede correr:y todos sus
*.java
archivos se agregarán de forma recursiva.fuente
zsh
shell para Windows ... te harás un favor para usarlo en lugar de bash, en mi humilde opinión.ls
).Un poco fuera de tema (no específicamente relacionado con git) pero si estás en Linux / Unix, una solución podría ser:
Y si esperas caminos con espacios:
Pero sé que eso no es exactamente lo que preguntaste.
fuente
La respuesta de Sergey (no me creas) está funcionando:
con un git reciente:
Archivos para la prueba:
Estado de Git:
Agregando * .txt:
Estado actualizado:
fuente
Si ya está rastreando sus archivos y ha realizado cambios en ellos y ahora desea agregarlos selectivamente en función de un patrón, puede usar la
--modified
banderaPor ejemplo, si solo desea agregar los cambios de CSS a esta confirmación, puede hacer
Ver
man git-ls-files
para más banderasfuente
Solo úsalo
git add *\*.java
. Esto agregará todos los archivos .java en el directorio raíz y todos los subdirectorios.fuente
Agregar una solución de línea de comandos de Windows que aún no se mencionó:
fuente
Solo quería agregar archivos que tuvieran una determinada cadena basada en
git status
:git status | grep string | xargs git add
y luego fue capaz de
git commit -m 'commit msg
confirmar todos los archivos modificados con "cadena" en el título del archivofuente
Como se menciona en " git: ¿Cómo agrego recursivamente todos los archivos en un subárbol de directorio que coinciden con un patrón global? ", Si escapa correctamente o cita su globbing de camino específico (como
'*.java'
), entonces sí, git add'*.java'
Git 2.13 (Q2 2017) mejora eso para la adición interactiva:
Ver commit 7288e12 (14 de marzo de 2017) por Jeff King (
peff
) .(Fusionada por Junio C Hamano -
gitster
- en commit 153e0d7 , 17 mar 2017)Históricamente, el lenguaje pathpec soportado por "
diff-index
" era más débil, pero ese ya no es el caso.fuente
poner línea en ~ / .gitconfig
[alias] addt = !sh -c 'git ls-files | grep \"\\.$1*\" | xargs git add' -
Si desea agregar todos los archivos Java modificados, simplemente puede hacer:
git addt java
Del mismo modo, si desea agregar todos los archivos python modificados, simplemente puede hacer:
git addt py
fuente