Buat pohon sembunyikan file gitignored

15

Apakah ada cara untuk treetidak menampilkan file yang diabaikan .gitignore?

Brad Urani
sumber
2
Jika Anda benar-benar ingin mempertimbangkan semua file yang mungkin diabaikan, coba parsing output dari git ls-files.
Franklin Yu

Jawaban:

5

Ini mungkin membantu: daftar gitfile yang diabaikan dalam cara yang hampir kompatibel untuk treefilter:

function tree-git-ignore {
    # tree respecting gitignore

    local ignored=$(git ls-files -ci --others --directory --exclude-standard)
    local ignored_filter=$(echo "$ignored" \
                    | egrep -v "^#.*$|^[[:space:]]*$" \
                    | sed 's~^/~~' \
                    | sed 's~/$~~' \
                    | tr "\\n" "|")
    tree --prune -I ".git|${ignored_filter: : -1}" "$@"
}
Jose Alban
sumber
8

Tree mendukung -Ibendera.

-I pattern
   Do not list those files that match the wild-card pattern.

Tree mendukung satu pola tunggal yang akan mengecualikan semua file / direktori yang cocok dengannya.

File abaikan Git sedikit lebih rumit:

Pengecualian dapat berasal dari banyak file,, $HOME/.config/git/ignoreoutput dari git config --get core.excludesfile, .gitignore(per direktori) ~/.gitignore,, dan lainnya (lihat man gitignore).

Masalah lain adalah pola yang treemendukung berbeda dari apa yang dilakukan git (seperti dicatat oleh @Brad Urani).

Tapi kita bisa dekat-ish ...

tree -I "$(grep -hvE '^$|^#' {~/,,$(git rev-parse --show-toplevel)/}.gitignore|sed 's:/$::'|tr \\n '\|')"

Atau sebagai fungsi:

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
}
Hati gelap
sumber
Bagus! Apakah saya benar bahwa fakta bahwa ini tidak menghapus baris komentar dari .gitignore akan menimbulkan masalah?
Brad Urani
Saya kira itu juga tidak akan menghormati file .gitignore di luar direktori home
Brad
@BradUrani - saya telah memperbarui jawaban saya untuk menggunakan gitperintah untuk mencoba menemukan file. Apa yang mengembalikan akan tergantung pada pengaturan apa yang Anda miliki.
DarkHeart
Ini tidak berfungsi untuk saya, saya pikir karena saya ~/.gitignoreadalah symlink. Saya telah berusaha menemukan cara untuk mengandalkan gituntuk memberi tahu saya apa yang diabaikan, tetapi semua upaya saya untuk menemukan kombinasi yang tepat terus berjalan ke dalam kesulitan atau situasi yang ambigu.
Brad Urani
Sepertinya tree -Imenghormati semua opsi globbing .gitignoreyang membuat saya berpikir tidak ada solusi yang sempurna. Perkiraan terbaik yang saya buat tadi malam adalah echo "node_modules|tmp|_build" > ~/.treeignoredantree -I "$(cat ~/.treeignore)"
Brad Urani