讓樹隱藏 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

相關內容