
Есть ли способ сделать так, чтобы tree
не отображались файлы, которые игнорируются в .gitignore
?
решение1
Другой способ возможен, если вы используетедерево 1.8.0
так как он поддерживает --fromfile
флаг:
--fromfile
Читает список каталогов из файла, а не из файловой системы. Пути, указанные в командной строке, — это файлы для чтения, а не каталоги для поиска. Точка (
.
) каталог указывает, что дерево должно считывать пути из стандартного ввода.
Мы могли бы использовать его git ls-tree
для получения всех файлов в проекте, не игнорируемых git, и передать вывод в tree
.
Предположим, у нас есть репозиторий git, в котором ignored
файлы игнорируются .gitignore
:
git_repo
├── .gitignore
├── bar
│ ├── b.txt
│ └── ignored
├── foo
│ ├── a.txt
│ └── ignored
└── ignored
Следующая команда:
git ls-tree -r --name-only HEAD | tree --fromfile
Дает:
.
├── .gitignore
├── bar
│ └── b.txt
└── foo
└── a.txt
2 directories, 3 files
Или, если вам нужен определенный путь:
git ls-tree -r --name-only HEAD foo | tree --fromfile
Дает:
.
└── a.txt
0 directories, 1 file
Предостережения
- Остерегатьсячто такие изменения, как удаление или переименование файлов, которые еще не были зафиксированы, могут привести к тому,
git ls-tree
что данные будут казаться несинхронизированными.
решение2
Рипгреппо умолчанию уважает .gitignore
(и некоторые другие файлы «игнорирует») и может использоваться как альтернатива командам git. Разница в том, что все файлы (кроме скрытых) перечислены, даже если они еще не были переданы в систему контроля версий:
rg --files | tree --fromfile
Это можно использовать для создания функции оболочки, которая сначала сортирует каталоги и обеспечивает более гибкое использование (указывая путь к каталогу и добавляя флаги ripgrep):
rg,tree() { rg --files $@|tree --fromfile --dirsfirst }
Требуется дерево > 1.8, как указано в другом ответе.
решение3
Дерево поддерживает -I
флаг.
-I 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
}
решение4
опция tree появилась --gitignore
в версии 2.0.0, выпущенной в декабре 2021 г.
https://gitlab.com/OldManProgrammer/unix-tree/-/blob/master/CHANGES