Answers:
这可能会有所帮助: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的ignore文件要复杂一些:
排除可能来自多个文件, $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
。