让树隐藏 gitignored 文件

让树隐藏 gitignored 文件

有没有办法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

这可用于创建一个 shell 函数,该函数首先对目录进行排序,并允许更灵活的使用(指定目录路径并添加 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~/.gitignoreman 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

--gitignore自 2021 年 12 月发布的 2.0.0 版本起,tree 有一个选项。

https://gitlab.com/OldManProgrammer/unix-tree/-/blob/master/CHANGES

相关内容