Git

讓樹隱藏 gitignored 文件

  • April 20, 2022

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

引用自:https://unix.stackexchange.com/questions/291282