Existe uma maneira de tree
não mostrar arquivos ignorados .gitignore
?
Responder1
Outra maneira é possível se você estiver usandoárvore 1.8.0
já que suporta a --fromfile
bandeira:
--fromfile
Lê uma listagem de diretórios de um arquivo em vez do sistema de arquivos. Os caminhos fornecidos na linha de comando são arquivos para leitura, em vez de diretórios para pesquisa. O ponto (
.
) indica que a árvore deve ler os caminhos da entrada padrão.
Poderíamos usar git ls-tree
para obter todos os arquivos não ignorados pelo git em um projeto e canalizar a saída para tree
.
Supondo que temos um repositório git, onde ignored
os arquivos são ignorados em .gitignore
:
git_repo
├── .gitignore
├── bar
│ ├── b.txt
│ └── ignored
├── foo
│ ├── a.txt
│ └── ignored
└── ignored
O seguinte comando:
git ls-tree -r --name-only HEAD | tree --fromfile
Dá:
.
├── .gitignore
├── bar
│ └── b.txt
└── foo
└── a.txt
2 directories, 3 files
Ou se você precisar de um caminho específico:
git ls-tree -r --name-only HEAD foo | tree --fromfile
Dá:
.
└── a.txt
0 directories, 1 file
Ressalvas
- Cuidadoque alterações como arquivos excluídos ou renomeados que ainda não foram confirmados podem fazer com
git ls-tree
que pareçam fora de sincronia.
Responder2
Ripgreprespeita .gitignore
(e alguns outros arquivos 'ignorados') por padrão e pode ser usado como uma alternativa aos comandos git. A diferença é que todos os arquivos (exceto os arquivos ocultos) são listados mesmo que ainda não tenham sido confirmados no controle de versão:
rg --files | tree --fromfile
Isso pode ser usado para criar uma função shell que classifica os diretórios primeiro e permite um uso mais flexível (especificando o caminho do diretório e adicionando sinalizadores ripgrep):
rg,tree() { rg --files $@|tree --fromfile --dirsfirst }
Requer árvore > 1,8 conforme apontado em outra resposta.
Responder3
A árvore apoia a -I
bandeira.
-I pattern
Não liste os arquivos que correspondem ao padrão curinga.
Tree suporta um único padrão que excluirá todos os arquivos/diretórios que correspondam a ele.
Os arquivos ignorados do Git são um pouco mais complicados:
A exclusão pode vir de vários arquivos, $HOME/.config/git/ignore
, da saída de git config --get core.excludesfile
, .gitignore
(por diretório), ~/.gitignore
, e mais (consulte man gitignore
).
Outro problema são os padrões que tree
o suporte difere do que o git faz (conforme observado por @Brad Urani).
Mas podemos chegar perto...
tree -I "$(grep -hvE '^$|^#' {~/,,$(git rev-parse --show-toplevel)/}.gitignore|sed 's:/$::'|tr \\n '\|')"
Ou como uma função:
function gtree {
git_ignore_files=("$(git config --get core.excludesfile)" .gitignore ~/.gitignore)
ignore_pattern="$(grep -hvE '^$|^#' "${git_ignore_files[@]}" 2>/dev/null|sed 's:/$::'|tr '\n' '\|')"
if git status &> /dev/null && [[ -n "${ignore_pattern}" ]]; then
tree -I "${ignore_pattern}" "${@}"
else
tree "${@}"
fi
}
Responder4
tree tem uma --gitignore
opção a partir da versão 2.0.0, lançada em dezembro de 2021.
https://gitlab.com/OldManProgrammer/unix-tree/-/blob/master/CHANGES