Hacer que el árbol oculte los archivos gitignored

15

¿Hay alguna manera de hacer que treeno se muestren los archivos que se ignoran .gitignore?

Brad Urani
fuente
2
Si realmente desea considerar todos los archivos ignorados posibles, intente analizar la salida de git ls-files.
Franklin Yu

Respuestas:

5

Esto podría ayudar: enumere los gitarchivos ignorados de una manera casi compatible para el 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
fuente
8

El árbol apoya la -Ibandera.

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

Tree admite un patrón único que excluirá todos los archivos / directorios que coincidan.

Los archivos de ignorar de Git son un poco más complicados:

La exclusión puede provenir de múltiples archivos, $HOME/.config/git/ignore, la salida git config --get core.excludesfile, .gitignore(por directorio), ~/.gitignorey más (ver man gitignore).

Otro problema es que los patrones que treesoportan difieren de lo que hace git (como lo señaló @Brad Urani).

Pero podemos acercarnos ...

tree -I "$(grep -hvE '^$|^#' {~/,,$(git rev-parse --show-toplevel)/}.gitignore|sed 's:/$::'|tr \\n '\|')"

O como una función:

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
}
Corazón oscuro
fuente
¡Agradable! ¿Estoy en lo cierto de que el hecho de que esto no elimine las líneas de comentarios de .gitignore causará problemas?
Brad Urani
Supongo que tampoco respetará los archivos .gitignore fuera del directorio de inicio
Brad
@BradUrani: he actualizado mi respuesta para usar gitcomandos para intentar encontrar el archivo. Lo que eso devuelva dependerá de la configuración que tenga.
DarkHeart
Esto no funciona para mí, creo que es porque mi ~/.gitignorees un enlace simbólico. He estado tratando de encontrar una manera de confiar gitpara decirme lo que se ignora, pero todos mis esfuerzos por encontrar la combinación correcta siguen teniendo dificultades o situaciones ambiguas.
Brad Urani
También parece tree -Ique respeta todas las opciones globales que .gitignoreme hace pensar que no hay una solución perfecta. La mejor aproximación que se me ocurrió anoche es echo "node_modules|tmp|_build" > ~/.treeignoreytree -I "$(cat ~/.treeignore)"
Brad Urani