ฉันพยายามที่จะแก้ปัญหา gitignore ในโครงสร้างไดเรกทอรีขนาดใหญ่ แต่เพื่อลดความซับซ้อนของคำถามของฉันฉันได้ลดลงดังต่อไปนี้
ฉันมีโครงสร้างไดเรกทอรีต่อไปนี้ของสองไฟล์ (foo, bar) ในแหล่งเก็บข้อมูล git ใหม่ล่าสุด (ยังไม่ได้ทำคอมมิชชัน):
a/b/c/foo
a/b/c/bar
เห็นได้ชัดว่า 'สถานะ git -u' แสดง:
# Untracked files:
...
# a/b/c/bar
# a/b/c/foo
สิ่งที่ฉันต้องการจะทำคือสร้างไฟล์. gignignore ที่ไม่สนใจทุกสิ่งภายใน a / b / c แต่ไม่สนใจไฟล์ 'foo'
ถ้าฉันสร้าง. gitignore ดังนั้น:
c/
จากนั้น 'สถานะ git -u' แสดงทั้ง foo และ bar ว่าถูกละเว้น:
# Untracked files:
...
# .gitignore
ซึ่งเป็นสิ่งที่ฉันคาดหวัง
ตอนนี้ถ้าฉันเพิ่มกฎการยกเว้นสำหรับ foo ดังนั้น:
c/
!foo
ตาม manpage ของ gitignore ฉันคาดหวังว่าสิ่งนี้จะได้ผล แต่มันไม่ใช่ - มันยังไม่สนใจ foo:
# Untracked files:
...
# .gitignore
สิ่งนี้ไม่ทำงาน:
c/
!a/b/c/foo
ไม่ทำสิ่งนี้:
c/*
!foo
ให้:
# Untracked files:
...
# .gitignore
# a/b/c/bar
# a/b/c/foo
ในกรณีนี้ถึงแม้ว่า foo จะไม่ถูกเพิกเฉยอีกต่อไป แต่ bar ก็ไม่ได้ถูกละเว้น
ลำดับของกฎใน. gitignore ดูเหมือนจะไม่สำคัญเช่นกัน
สิ่งนี้ไม่ได้ทำตามที่ฉันคาดไว้:
a/b/c/
!a/b/c/foo
คนนั้นไม่สนใจทั้ง foo และ bar
สถานการณ์หนึ่งที่ทำงานได้คือถ้าฉันสร้างไฟล์ a / b / c / .gitignore และใส่เข้าไปในนั้น:
*
!foo
แต่ปัญหาของเรื่องนี้คือในที่สุดจะมีไดเรกทอรีย่อยอื่น ๆ ภายใต้ a / b / c และฉันไม่ต้องการที่จะใส่. gitignore แยกต่างหากลงในทุก ๆ อัน - ฉันหวังว่าจะสร้าง 'project-based' .itignore ไฟล์ที่สามารถนั่งในไดเรกทอรีบนสุดของแต่ละโครงการและครอบคลุมโครงสร้างย่อยทั้งหมดของ 'มาตรฐาน'
สิ่งนี้ดูเหมือนจะเทียบเท่า:
a/b/c/*
!a/b/c/foo
นี่อาจเป็นสิ่งที่ใกล้เคียงที่สุดกับ "การทำงาน" ที่ฉันสามารถทำได้ แต่ต้องระบุเส้นทางสัมพัทธ์เต็มรูปแบบและข้อยกเว้นที่ชัดเจนซึ่งจะเป็นความเจ็บปวดหากฉันมีไฟล์ชื่อ 'foo' ในระดับต่าง ๆ มากมาย ของแผนผังย่อย
อย่างไรก็ตามฉันอาจไม่เข้าใจว่ากฎการยกเว้นทำงานอย่างไรหรือพวกเขาไม่ทำงานเลยเมื่อไดเรกทอรี (แทนที่จะใช้สัญลักษณ์แทน) จะถูกเพิกเฉยโดยกฎที่ลงท้ายด้วย a /
ใครช่วยได้โปรดส่องแสงนี้หน่อยได้ไหม?
มีวิธีที่จะทำให้ gitignore ใช้สิ่งที่มีเหตุผลเช่นนิพจน์ปกติแทนที่จะใช้ไวยากรณ์เชลล์ที่เงอะงะนี้หรือไม่?
ฉันใช้และสังเกตด้วย git-1.6.6.1 บน Cygwin / bash3 และ git-1.7.1 บน Ubuntu / bash3