ทั้งสองตัวอย่างในคำถามเป็นตัวอย่างที่แย่มาก ๆ ที่อาจนำไปสู่การสูญเสียข้อมูล!
คำแนะนำของฉัน: อย่าผนวก/*
เข้ากับไดเรกทอรีในไฟล์. gignignore เว้นแต่คุณจะมีเหตุผลที่ดี
เหตุผลที่ดีจะเป็นเช่นสิ่ง Jefromi wrote: "ถ้าคุณตั้งใจจะต่อมายกเลิกไม่สนใจสิ่งที่อยู่ในไดเรกทอรี"
เหตุผลที่ไม่ควรทำอย่างอื่นก็คือการผนวก/*
ไปยังไดเรกทอรีทำงานด้วยมือข้างหนึ่งในลักษณะที่มันไม่สนใจเนื้อหาทั้งหมดของไดเรกทอรี แต่ในทางกลับกันมันมีผลข้างเคียงที่อันตราย:
หากคุณดำเนินการgit stash -u
(เพื่อซ่อนไฟล์ที่ถูกติดตามและไม่ได้ติดตาม) หรือgit clean -df
(เพื่อลบไฟล์ที่ไม่ได้ติดตาม แต่เก็บไฟล์ที่ถูกเพิกเฉย) ในที่เก็บของคุณไดเรกทอรีทั้งหมดที่ถูกละเว้นด้วยการผนวก/*
จะถูกลบทิ้งอย่างถาวร !
พื้นหลังบางส่วน
ฉันต้องเรียนรู้วิธีนี้อย่างหนัก มีคนในทีมของฉันต่อท้าย/*
ไดเรกทอรีบางรายการใน. gitignore ของเรา เมื่อเวลาผ่านไปฉันมีโอกาสที่บางไดเรกทอรีจะหายไปทันที ไดเรกทอรีที่มีกิกะไบต์ของข้อมูลท้องถิ่นที่แอปพลิเคชันของเราต้องการ ไม่มีใครสามารถอธิบายได้และฉันจะทำการดาวน์โหลดข้อมูลทั้งหมดอีกครั้ง git stash
หลังจากที่ในขณะที่ผมได้คิดว่ามันอาจจะต้องทำอย่างไรกับ วันหนึ่งฉันต้องการล้าง repo ในพื้นที่ของฉัน (ในขณะที่เก็บไฟล์ที่ถูกเพิกเฉย) และฉันกำลังใช้git clean -df
และข้อมูลของฉันก็หายไป เวลานี้ฉันมีเพียงพอและตรวจสอบปัญหา /*
ในที่สุดผมก็คิดว่าเหตุผลที่เป็นท้าย
ฉันคิดว่ามันสามารถอธิบายได้อย่างใดโดยความจริงที่directory/*
ไม่สนใจเนื้อหาทั้งหมดของไดเรกทอรี แต่ไม่ไดเรกทอรีเอง ดังนั้นจึงไม่ถือว่าถูกติดตามหรือเพิกเฉยเมื่อสิ่งต่างๆถูกลบ แม้ว่าgit status
และgit status --ignored
ให้ภาพที่แตกต่างกันเล็กน้อยกับมัน
วิธีการทำซ้ำ
นี่คือวิธีการทำซ้ำพฤติกรรม ฉันใช้ Git 2.8.4 อยู่ในขณะนี้
ไดเรกทอรีที่เรียกว่าlocaldata/
ไฟล์จำลองในนั้น ( important.dat
) จะถูกสร้างขึ้นในพื้นที่เก็บข้อมูล git ท้องถิ่นและเนื้อหาจะถูกละเว้นโดยการใส่/localdata/*
ลงใน.gitignore
ไฟล์ เมื่อคำสั่ง git หนึ่งในสองคำสั่งถูกดำเนินการในขณะนี้ไดเรกทอรีจะหายไปโดยไม่คาดคิด
mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file
ถ้าคุณทำgit status --ignored
ที่นี่คุณจะได้รับ:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
untracked-file
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
localdata/
ตอนนี้ก็ทำ
git stash -u
git stash pop
หรือ
git clean -df
ในทั้งสองกรณีไดเรกทอรีที่ถูกกล่าวหาlocaldata
จะหายไป!
ไม่แน่ใจว่านี่ถือเป็นข้อผิดพลาดหรือไม่ แต่ฉันเดาว่าอย่างน้อยมันเป็นคุณสมบัติที่ไม่มีใครต้องการ
ฉันจะรายงานเรื่องนั้นในรายการการพัฒนา git และดูว่าพวกเขาคิดอย่างไร
.gitignore
แตกต่างระหว่างไฟล์และไดเรกทอรีที่ถูกละเว้น เช่นdata
vsdata/
หมายถึงสิ่งที่แตกต่างกันหรือไม่