让树隐藏gitignored文件


Answers:


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的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
}

真好!我是否纠正不从.gitignore中删除注释行的事实会导致问题?
布拉德·乌拉尼

我想它也不会尊重主目录外的.gitignore文件
布拉德·

@BradUrani-我已经更新了答案,可以使用git命令来查找文件。返回的内容取决于您的设置。
DarkHeart

我认为这对我不起作用,因为我~/.gitignore是符号链接。我一直在尝试寻找一种方法来依靠git告诉我哪些被忽略的内容,但是我为找到正确的组合而付出的所有努力总是遇到困难或模棱两可的情况。
布拉德·乌拉尼

而且看起来tree -I确实尊重所有这样做的选项,.gitignore这使我认为没有完美的解决方案。我想出了昨晚的最佳近似echo "node_modules|tmp|_build" > ~/.treeignoretree -I "$(cat ~/.treeignore)"
布拉德Urani
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.