วิธีแก้ปัญหาที่แสดงเป็นคำตอบที่มีการโหวตมากที่สุดนั้นไม่ถูกต้องและสามารถพิสูจน์ได้ง่ายเช่นนี้
เริ่มต้นด้วยการละเว้นทุกสิ่งในการอัปโหลด / *:
mkdir -p uploads/rubbish/stuff/KEEP_ME
touch uploads/a uploads/rubbish/a uploads/rubbish/stuff/a uploads/rubbish/stuff/KEEP_ME/a
echo '/uploads/*' >> .gitignore
git init
git add .
git commit -m "Initial commit"
ตอนนี้ยกเลิกการใส่ไดเร็กทอรีหลักของสิ่งที่ถูกละเว้นตามด้านบน:
echo 'uploads/rubbish/stuff/KEEP_ME/' >> .gitignore
echo 'uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u
ไม่แสดงไฟล์ที่ไม่ถูกติดตาม
เพื่อให้มันใช้งานได้คุณต้องละเว้นไฟล์ทั้งหมดที่อยู่ใต้uploads/
โครงสร้าง ( uploads/**/*
ไม่ใช่แค่ระดับบนสุดuploads/*
) จากนั้นเพิ่มไดเร็กทอรีหลักทั้งหมดของต้นไม้ที่คุณต้องการเก็บไว้
echo '/uploads/**/*' > .gitignore
echo '!/uploads/rubbish/' >> .gitignore
echo '!/uploads/rubbish/stuff' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u
ซึ่งจะช่วยให้:
On branch master
...
Untracked files:
(use "git add <file>..." to include in what will be committed)
uploads/rubbish/stuff/KEEP_ME/a
หากเราใช้uploads/*
ใน.gitignore
ข้างต้นไฟล์กลางทั้งหมดจะถูกรวมไว้ด้วยเช่นกันตัวอย่างเช่นuploads/rubbish/a
จะปรากฏในคำสั่งสถานะด้านบน