Faça com que a árvore oculte arquivos gitignorados

Faça com que a árvore oculte arquivos gitignorados

Existe uma maneira de treenão mostrar arquivos ignorados .gitignore?

Responder1

Outra maneira é possível se você estiver usandoárvore 1.8.0 já que suporta a --fromfilebandeira:

--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-treepara 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 ignoredos 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-treeque 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 -Ibandeira.

-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 treeo 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 --gitignoreopção a partir da versão 2.0.0, lançada em dezembro de 2021.

https://gitlab.com/OldManProgrammer/unix-tree/-/blob/master/CHANGES

informação relacionada