รูปแบบเชิงลบทำงานอย่างไรใน. gitignore


94

ฉันกำลังพยายามใช้ไฟล์. gitignore ที่มีรูปแบบเชิงลบ (บรรทัดที่ขึ้นต้นด้วย!) แต่มันไม่ได้ผลตามที่ฉันคาดหวัง

เป็นตัวอย่างเล็กน้อยฉันมีโครงสร้างไดเร็กทอรีต่อไปนี้:

C:/gittest
 -- .gitignore
 -- aaa/
   -- bbb/
     -- file.txt
   -- ccc/
     -- otherfile.txt

และในไฟล์ gitignore ของฉันฉันมีสิ่งนี้:

aaa/
!aaa/ccc/

ความเข้าใจของฉัน (ตามหน้าเอกสารนี้ ) คือไม่ควรละเลยไฟล์ aaa / ccc / otherfile.txt แต่ในความเป็นจริง git คือการละเว้นทุกอย่างภายใต้ aaa

ฉันเข้าใจผิดประโยคนี้: "คำนำหน้าไม่บังคับ! ซึ่งลบล้างรูปแบบไฟล์ที่ตรงกันใด ๆ ที่ถูกยกเว้นโดยรูปแบบก่อนหน้านี้จะถูกรวมไว้อีกครั้ง"?

BTW นี่คือบน Windows ที่มี msysgit 1.7.0.2

คำตอบ:


164

ฉันคิดว่าสิ่งที่คุณต้องการทำคือ:

aaa/*
!aaa/ccc

คุณกำลังบอกว่า "อย่ามองเข้าไปaaa" ดังนั้นจึงไม่ได้ตรวจสอบเส้นทางaaa/cccด้วยซ้ำ หากคุณใช้สัญลักษณ์แทนมันจะยังคงอ่านเนื้อหาของaaaแต่ละรายการจะตรงกับสัญลักษณ์แทนและจะถูกละเว้นยกเว้นaaa/cccจะถูกใส่กลับเข้าไป


2
@iconoclast: ถ้าอย่างนั้นคุณอาจจะทำอะไรที่แตกต่างออกไป โพสต์คำถามอื่น (พร้อมข้อมูลครบถ้วน) หากคุณต้องการความช่วยเหลือ
Cascabel

สิ่งนี้ใช้ไม่ได้กับฉัน: / apps / *! / apps / myApps / FluidTest / bin /
Jarrod Smith

5
@Jarrod มันทำงาน; คุณกำลังทำอะไรบางอย่างที่แตกต่างออกไป คุณจะต้องใช้วิธีนี้ซ้ำ ๆ ด้วยเหตุผลที่ให้ไว้ในคำตอบ ! apps / myApps, apps / myApps / * และอื่น ๆ
Cascabel

อ่าขอโทษตอนนี้ฉันเข้าใจแล้ว แต่ดังนั้นจะไม่ให้ฉันโหวตอีก
Jarrod Smith

สงสัยว่าทำไมมันใช้ไม่ได้กับ aaa / ** / *! aaa / ccc / eee (ละเว้นทุกอย่างยกเว้นไฟล์ในเส้นทางที่แน่นอน)
PhươngNguyễn

23

หากคุณต้องการยกเว้นทุกอย่างในaaaแต่รวมaaa/cccและทุกอย่างไว้ข้างใต้คุณควรใช้:

aaa/*
!aaa/ccc
!aaa/ccc/*

บรรทัดแรกบอกคอมไพล์ที่จะไม่สนใจ Everthing ใต้aaaที่สองบอกว่ามันไม่ได้ที่จะไม่สนใจโฟลเดอร์aaa/cccซึ่งอันที่จริง "ช่วยให้" aaa/cccบรรทัดที่สามซึ่งก็บอกว่ามันไม่ได้ที่จะไม่สนใจทุกอย่างภายใต้


1
บรรทัดที่สามไม่สร้างความแตกต่างให้กับฉัน
James Hopkin

3
เพื่อให้สามารถรวมทุกอย่างไว้ในไดเรกทอรีย่อยaaa/cccในทุกระดับสิ่งที่ได้ผลสำหรับฉันคือ!aaa/ccc/**แทนที่จะเป็น!aaa/ccc/*
boclodoa

3

หากใครยังไม่เห็นไอเท็มใหม่ที่ยังไม่ถูกเพิกเฉยในการgit statusรันgit update-indexก่อนหน้าสามารถช่วยคอมไพล์เพื่อดูการเปลี่ยนแปลง (อย่างน้อยในเวอร์ชัน 1.9.x ของ gitbash)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.