Есть ли способ заставить tree
не показывать файлы, которые игнорируются в .gitignore
?
Есть ли способ заставить tree
не показывать файлы, которые игнорируются в .gitignore
?
Ответы:
Это может помочь: 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}" "$@"
}
Дерево поддерживает -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
}
git
команды, чтобы попытаться найти файл. Что это возвращает, будет зависеть от того, какие настройки у вас есть.
~/.gitignore
символическая ссылка. Я пытался найти способ полагаться на то, git
чтобы сказать мне, что игнорируется, но все мои попытки найти правильную комбинацию продолжают сталкиваться с трудностями или неоднозначными ситуациями.
tree -I
что уважает все варианты глобализации, .gitignore
что заставляет меня думать, что нет идеального решения. Лучшее приближение, которое я придумал прошлой ночью, - echo "node_modules|tmp|_build" > ~/.treeignore
иtree -I "$(cat ~/.treeignore)"
git ls-files
.