Faça com que a árvore oculte arquivos com gitignored

15

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

Brad Urani
fonte
2
Se você realmente deseja considerar todos os arquivos ignorados possíveis, tente analisar a saída de git ls-files.
Franklin Yu

Respostas:

5

Isso pode ajudar: a listar gitarquivos ignorados de uma maneira quase compatível para o treefiltro:

function tree-git-ignore {
    # tree respecting gitignore

    local ignored=$(git ls-files -ci --others --directory --exclude-standard)
    local ignored_filter=$(echo "$ignored" \
                    | egrep -v "^#.*$|^[[:space:]]*$" \
                    | sed 's~^/~~' \
                    | sed 's~/$~~' \
                    | tr "\\n" "|")
    tree --prune -I ".git|${ignored_filter: : -1}" "$@"
}
Jose Alban
fonte
8

A árvore suporta a -Ibandeira.

-I pattern
   Do not list those files that match the wild-card pattern.

O Tree suporta um único padrão que excluirá todos os arquivos / diretórios correspondentes.

Os arquivos ignorados do Git são um pouco mais complicados:

Exclusão pode vir de vários arquivos, $HOME/.config/git/ignore, a saída git config --get core.excludesfile, .gitignore(por diretório), ~/.gitignoree mais (veja man gitignore).

Outro problema é que os padrões treesuportados diferem do que o git faz (como 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
}
DarkHeart
fonte
Agradável! Estou correto que o fato de isso não estar removendo as linhas de comentário do .gitignore causará problemas?
Brad Urani
Eu acho que também não vai respeitar .gitignore arquivos fora do diretório home 🤔
Brad Urani
@BradUrani - atualizei minha resposta para usar gitcomandos para tentar encontrar o arquivo. O que isso retorna dependerá da configuração que você tiver.
darkheart
Isso não está funcionando para mim, acho que porque o meu ~/.gitignoreé um link simbólico. Eu tenho tentado encontrar uma maneira de confiar gitpara me dizer o que é ignorado, mas todos os meus esforços para encontrar a combinação certa continuam enfrentando dificuldades ou situações ambíguas.
Brad Urani
Também parece tree -Ique respeita todas as opções de globbing que .gitignorefazem, o que me faz pensar que não há solução perfeita. A melhor aproximação que eu vim com a noite passada é echo "node_modules|tmp|_build" > ~/.treeignoreetree -I "$(cat ~/.treeignore)"
Brad Urani