Como adiciono recursivamente arquivos por um padrão (ou glob) localizado em diretórios diferentes?
Por exemplo, eu gostaria de adicionar A/B/C/foo.java
e D/E/F/bar.java
(e vários outros arquivos java) com um comando:
git add '*.java'
Infelizmente, isso não funciona como o esperado.
git
glob
filepattern
Michel Krämer
fonte
fonte
.java
arquivos (já rastreados) em seu diretório atual, pode estar enfrentando uma manipulação complicada , er, de curinga entre o bash e o "auxiliar" da linha de comando do msys . Não tenho certeza sobre uma solução. Você pode tentar várias camadas de aspas:git add '"*.java"'
(as aspas simples são usadas pelo bash para impedir a expansão da glob, as aspas duplas são tomadas pela camada msys para impedir a expansão da glob).git add *.java
funciona para mim (em powershell com o cliente GitHub)Respostas:
A resposta de Sergio Acosta é provavelmente a sua melhor aposta, se alguns dos arquivos a serem adicionados ainda não estiverem rastreados. Se você deseja limitar-se aos arquivos que o git já conhece, você pode combinar
git-ls-files
com um filtro:O Git não fornece mecanismos sofisticados para fazer isso sozinho, pois é basicamente um problema de shell: como você obtém uma lista de arquivos para fornecer como argumentos para um determinado comando.
fonte
git ls-files -co --exclude-standard | grep '\.java$' | xargs git add
Você pode usar
git add [path]/\*.java
para adicionar arquivos java de subdiretórios,por exemplo ,
git add ./\*.java
para o diretório atual.Da
git add
documentação :fonte
Com
zsh
você pode executar:e todos os seus
*.java
arquivos serão adicionados recursivamente.fonte
zsh
shell para o Windows ... você fará um favor a si mesmo em usá-lo em vez de bash, imho.ls
).Um tópico pouco interessante (não especificamente relacionado ao git), mas se você estiver no linux / unix, uma solução alternativa pode ser:
E se você espera caminhos com espaços:
Mas eu sei que não é exatamente o que você pediu.
fonte
A resposta de Sergey (não me credite) está funcionando:
com um git recente:
Arquivos para o teste:
Status do Git:
Adicionando * .txt:
Status atualizado:
fonte
Se você já está acompanhando seus arquivos e fez alterações neles, e agora deseja adicioná-los seletivamente com base em um padrão, pode usar o
--modified
sinalizadorPor exemplo, se você deseja adicionar apenas as alterações de CSS a esse commit, você pode fazer
Veja
man git-ls-files
para mais sinalizadoresfonte
Apenas use
git add *\*.java
. Isso adicionará todos os arquivos .java no diretório raiz e todos os subdiretórios.fonte
Adicionando uma solução de linha de comando do Windows que ainda não foi mencionada:
fonte
Eu queria adicionar apenas arquivos que tivessem uma determinada string com base em
git status
:git status | grep string | xargs git add
e, em seguida, conseguiu
git commit -m 'commit msg
confirmar todos os arquivos alterados com "string" no título do arquivofonte
Como mencionado em " git: como adiciono recursivamente todos os arquivos em uma subárvore de diretório que correspondem a um padrão glob? ", Se você escapar ou citar corretamente o pathspec globbing (como
'*.java'
), sim, git add'*.java'
O Git 2.13 (Q2 2017) melhora isso para adicionar interativo:
Veja commit 7288e12 (14 de março de 2017) por Jeff King (
peff
) .(Mesclado por Junio C Hamano -
gitster
- na confirmação 153e0d7 , 17 de março de 2017)Historicamente, a linguagem pathspec suportada por "
diff-index
" era mais fraca, mas esse não é mais o caso.fonte
colocar linha em ~ / .gitconfig
[alias] addt = !sh -c 'git ls-files | grep \"\\.$1*\" | xargs git add' -
Se você deseja adicionar todos os arquivos java modificados, basta:
git addt java
Da mesma forma, se você deseja adicionar todos os arquivos python modificados, basta:
git addt py
fonte