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)
add --interactive
: não expanda pathspecs com ls-files
Quando queremos obter a lista de arquivos modificados, primeiro expandimos os códigos de caminho fornecidos pelo usuário com " ls-files
" e, em seguida, alimentamos a lista resultante de caminhos como argumentos para " diff-index
" e " diff-files
".
Se o seu pathspec se expandir para um grande número de caminhos, você poderá encontrar um dos dois problemas:
O sistema operacional pode reclamar do tamanho da lista de argumentos e se recusar a executar. Por exemplo:
$ (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.
Está no linux.git
repositório, que possui cerca de 20K arquivos no diretório "drivers" (nenhum deles modificado neste caso). O ulimit -s
truque " " é necessário para mostrar o problema no Linux, mesmo para um conjunto tão grande de caminhos.
Outros sistemas operacionais têm limites muito menores (por exemplo, um caso do mundo real foi visto com apenas 5K arquivos no OS X).
Mesmo quando funciona, é muito lento. O código do pathspec não é otimizado para um grande número de caminhos. Aqui está o mesmo caso sem o ulimit:
$ time git add -p drivers
No changes.
real 0m16.559s
user 0m53.140s
sys 0m0.220s
Nós podemos melhorar isso pulando " ls-files
" completamente, e apenas alimentando o pathspecs original aos comandos diff.
Historicamente, a linguagem pathspec suportada por " diff-index
" era mais fraca, mas esse não é mais o caso.