有没有办法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
~/.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
--gitignore
自 2021 年 12 月发布的 2.0.0 版本起,tree 有一个选项。
https://gitlab.com/OldManProgrammer/unix-tree/-/blob/master/CHANGES