Есть дерево, чтобы скрыть gitignored файлы

15

Есть ли способ заставить treeне показывать файлы, которые игнорируются в .gitignore?

Брэд Урани
источник
2
Если вы действительно хотите рассмотреть все возможные игнорируемые файлы, попробуйте проанализировать вывод git ls-files.
Франклин Ю

Ответы:

5

Это может помочь: gitвывести список игнорируемых файлов почти совместимым способом для treeфильтра:

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}" "$@"
}
Хосе Албан
источник
8

Дерево поддерживает -Iфлаг.

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

Дерево поддерживает один шаблон, который исключит все файлы / каталоги, которые ему соответствуют.

Файлы игнорирования в Git немного сложнее:

Исключение может исходить из нескольких файлов, $HOME/.config/git/ignoreвыходной сигнал git config --get core.excludesfile, .gitignore(в каталоге), ~/.gitignoreи многое другое (см man gitignore).

Другая проблема заключается в том, что treeподдерживаемые шаблоны отличаются от того, что делает git (как отмечает @Brad Urani).

Но мы можем приблизиться ...

tree -I "$(grep -hvE '^$|^#' {~/,,$(git rev-parse --show-toplevel)/}.gitignore|sed 's:/$::'|tr \\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
}
Темное сердце
источник
Ницца! Я прав, что тот факт, что это не удаляет строки комментариев из .gitignore, вызовет проблемы?
Брэд Урани
Я предполагаю, что это также не будет уважать файлы .gitignore вне домашнего каталога 🤔
Брэд Урани
@BradUrani - я обновил свой ответ, чтобы использовать gitкоманды, чтобы попытаться найти файл. Что это возвращает, будет зависеть от того, какие настройки у вас есть.
DarkHeart
Это не работает для меня, я думаю, потому что моя ~/.gitignoreсимволическая ссылка. Я пытался найти способ полагаться на то, gitчтобы сказать мне, что игнорируется, но все мои попытки найти правильную комбинацию продолжают сталкиваться с трудностями или неоднозначными ситуациями.
Брэд Урани
Кроме того, похоже, tree -Iчто уважает все варианты глобализации, .gitignoreчто заставляет меня думать, что нет идеального решения. Лучшее приближение, которое я придумал прошлой ночью, - echo "node_modules|tmp|_build" > ~/.treeignoreиtree -I "$(cat ~/.treeignore)"
Брэд Урани