Niech drzewo ukryje pliki gitignored

15

Czy istnieje sposób, aby treenie wyświetlać plików, które są ignorowane .gitignore?

Brad Urani
źródło
2
Jeśli naprawdę chcesz rozważyć wszystkie możliwe ignorowane pliki, spróbuj przeanalizować dane wyjściowe git ls-files.
Franklin Yu,

Odpowiedzi:

5

Może to pomóc: wyświetl listę gitignorowanych plików w prawie zgodny sposób dla treefiltru:

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
źródło
8

Drzewo obsługuje -Iflagę.

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

Drzewo obsługuje pojedynczy wzorzec, który wyklucza wszystkie pasujące do niego pliki / katalogi.

Pliki ignorowania Gita są nieco bardziej skomplikowane:

Wykluczenie może pochodzić z wielu plików, $HOME/.config/git/ignoredanych wyjściowych git config --get core.excludesfile, .gitignore(według katalogu) ~/.gitignorei innych (patrz man gitignore).

Innym problemem jest to, że treeobsługiwane wzorce różnią się od tego, co robi git (jak zauważył @Brad Urani).

Ale możemy się zbliżyć ...

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

Lub jako funkcja:

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
}
Ciemne serce
źródło
Ładny! Czy mam rację, że fakt, że nie usuwa to wierszy komentarza z .gitignore, spowoduje problemy?
Brad Urani
Chyba nie będzie też szanował plików .gitignore poza domowym reż. 🤔
Brad Urani
@BradUrani - zaktualizowałem swoją odpowiedź, aby użyć gitpoleceń, aby spróbować znaleźć plik. To, co powróci, zależy od tego, jakie masz ustawienie.
DarkHeart
Myślę, że to nie działa, ponieważ moje ~/.gitignorejest dowiązaniem symbolicznym. Próbowałem znaleźć sposób, aby polegać na gitinformowaniu mnie o tym, co jest ignorowane, ale wszystkie moje wysiłki, aby znaleźć odpowiednią kombinację, napotykają trudności lub niejednoznaczne sytuacje.
Brad Urani
Wygląda też na to, że tree -Iszanuje wszystkie opcje globowania, .gitignoreco sprawia, że ​​uważam, że nie ma idealnego rozwiązania. Najlepszym przybliżeniem, jakie wymyśliłem ostatniej nocy, jest echo "node_modules|tmp|_build" > ~/.treeignoreitree -I "$(cat ~/.treeignore)"
Brad Urani