คำตอบ:
สิ่งนี้อาจช่วยได้: รายการgit
ไฟล์ที่ถูกละเว้นในวิธีที่เกือบเข้ากันได้สำหรับtree
ตัวกรอง:
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}" "$@"
}
ต้นไม้รองรับ-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
รองรับแตกต่างจากสิ่งที่คอมไพล์ทำ (ดังที่ระบุไว้โดย @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
}
git
คำสั่งเพื่อลองค้นหาไฟล์ สิ่งที่ส่งกลับจะขึ้นอยู่กับการตั้งค่าที่คุณมี
~/.gitignore
เป็น symlink ฉันพยายามหาวิธีที่จะพึ่งพาgit
เพื่อบอกฉันว่าสิ่งใดที่ถูกเพิกเฉย แต่ความพยายามทั้งหมดของฉันเพื่อค้นหาชุดค่าผสมที่ถูกต้องยังคงมีปัญหาหรือสถานการณ์ที่ไม่ชัดเจน
tree -I
จะเคารพตัวเลือกที่กลมกลืน.gitignore
ซึ่งทำให้ฉันคิดว่าไม่มีทางออกที่สมบูรณ์แบบ ประมาณการที่ดีที่สุดที่ฉันมากับคืนที่ผ่านมาเป็นecho "node_modules|tmp|_build" > ~/.treeignore
และtree -I "$(cat ~/.treeignore)"
git ls-files
ถ้าคุณอยากที่จะต้องพิจารณาไฟล์ละเว้นเป็นไปได้ทั้งหมดพยายามที่จะแยกการส่งออกของ