Você instruiu o bash a usar o mecanismo interno de conclusão de arquivos para git , em vez de chamar a função de conclusão externa que entende a sintaxe do comando git . Há apenas um mecanismo de conclusão, não uma série de filtros. Se você quer uma série de filtros, você tem que codificar.
Felizmente, o script de conclusão git de 2,7 kLoC suporta padrões excluindo de git add da maneira natural: adicione esses padrões a .gitignore .
printf '%s\n' '*.cm[aiox]' '*.cmxa' '*.[ao]' >>.gitignore
Se você quiser excluir arquivos da git add completion sem adicioná-los à lista de ignorados do git, acho que você terá que mergulhar no script de conclusão do git. _git_add chamadas __git_complete_index_file que chama __git_index_files para gerar a lista de arquivos candidatos e, por sua vez, chama __git_ls_files_helper , que chama git ls-files com as opções que foram transmitidas até o fim de _git_add . Então, em _git_add você pode mudar
__git_complete_index_file "--others --modified --directory --no-empty-directory"
para adicionar algumas opções como --exclude=*.cm[aiox] (cuidado com os problemas de citação: os curingas são eventualmente unidos no comando, então -x *.cm[aiox] não funcionaria porque o padrão seria expandido no diretório atual).