Скрыть файлы, игнорируемые git

Скрыть файлы, игнорируемые git

Есть ли способ сделать так, чтобы 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

Связанный контент