Нехай дерево заховає позовні файли


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 файли за межами будинку dir 🤔
Бред Урані

@BradUrani - я оновив свою відповідь, щоб використовувати gitкоманди, щоб спробувати знайти файл. Те, що повертається, буде залежати від налаштувань.
DarkHeart

Це не працює для мене, я думаю, тому що мій ~/.gitignore- це симпосилання. Я намагався знайти спосіб покластися, gitщоб сказати мені, що ігнорується, але всі мої зусилля з пошуку правильної комбінації продовжують стикатися з труднощами або неоднозначними ситуаціями.
Бред Урані

Крім того, схоже, tree -Iчи поважають усі варіанти глобалізації, що .gitignoreробить, що змушує мене думати, що немає ідеального рішення. Найкраще наближення я прийшов з останньою ніччю echo "node_modules|tmp|_build" > ~/.treeignoreіtree -I "$(cat ~/.treeignore)"
Бред уран
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.