¿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.javay 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

.javaarchivos (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 *.javafunciona 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-filescon 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 addPuede usar
git add [path]/\*.javapara agregar archivos Java desde subdirectorios,por ejemplo ,
git add ./\*.javapara el directorio actual.De la
git adddocumentación :fuente
Con
zshusted puede correr:y todos sus
*.javaarchivos se agregarán de forma recursiva.fuente
zshshell 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
--modifiedbanderaPor ejemplo, si solo desea agregar los cambios de CSS a esta confirmación, puede hacer
Ver
man git-ls-filespara 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 addy luego fue capaz de
git commit -m 'commit msgconfirmar 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 javaDel mismo modo, si desea agregar todos los archivos python modificados, simplemente puede hacer:
git addt pyfuente