Git
讓樹隱藏 gitignored 文件
有沒有辦法
tree
不顯示被忽略的文件.gitignore
?
如果您正在使用另一種
tree 1.8.0
方法,因為它支持--fromfile
標誌:--fromfile Reads a directory listing from a file rather than the file-system. Paths provided on the command line are files to read from rather than directories to search. The dot (.) directory indicates that tree should read paths from standard input.
我們可以
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
顯示不同步。
樹支持
-I
標誌。-I pattern Do not list those files that match the wild-card 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 }