有沒有辦法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