ฉันจะเพิ่มไฟล์ที่ไม่มีจุด (ไฟล์ที่ไม่มีนามสกุลทั้งหมด) ไปยังไฟล์ gitignore ได้อย่างไร


111

อย่างที่ชื่อบอกเป็นไปได้ไหมที่จะเพิ่ม "ไฟล์ที่ไม่มีจุด" ลงในไฟล์ gitignore

ฉันคิดว่านี่จะดูแลไฟล์นามสกุลที่น่ารำคาญเหล่านั้นทั้งหมด


2
: มีบางไฟล์ extensionless ที่คุณไม่ต้องการที่จะไม่สนใจอยู่README, LICENSEหรือCOPYING, INSTALL, Makefileฯลฯ แต่คุณก็สามารถบังคับให้เพิ่มพวกเขาและพวกเขาก็มีการติดตาม
ยาคุบบNarębski

@ JakubNarębskiจุดดี. ฉันได้รวมไว้ในคำตอบของฉันเพื่อให้มองเห็นได้มากขึ้น
VonC

เป็นไปได้ที่จะทำสำเนาgitignore โดยไม่มีไฟล์ไบนารี
Mad Physicist

คำตอบ:


121

คุณสามารถลองใช้ชุดค่าผสมที่คล้ายกับ:

*
!/**/
!*.*

gitignoreกฎการยกเว้นนั้น( รูปแบบที่เป็นลบ ) ควรละเว้นไฟล์ทั้งหมดยกเว้นไฟล์ที่มีนามสกุล

ดังที่กล่าวไว้ด้านล่างโดยMad Physicistกฎคือ:

ไม่สามารถรวมไฟล์ใหม่ได้หากไม่รวมไดเร็กทอรีหลักของไฟล์นั้น (*)
(*: เว้นแต่เงื่อนไขบางประการจะตรงตาม git 2.?+ ดูด้านล่าง)

นั่นคือเหตุผลว่าทำไมจึง!/**/มีความสำคัญ (การทำรายการโฟลเดอร์หลักซ้ำ ๆ เป็นสีขาว) หากเราต้องการทำรายการไฟล์สีขาว

ฉันพูดถึงกฎเดียวกันนี้ในกรณีที่คล้ายกันเช่น:


ในฐานะที่เป็นยาคุบบNarębski ความคิดเห็นที่คุณอาจไม่ต้องการที่จะไม่สนใจทุกไฟล์ extensionless

คำแนะนำของฉัน:

  • เพิ่มไฟล์ที่ไม่มีนามสกุลเป็นอันดับแรก
  • จากนั้นแก้ไขของคุณ.gitignoreตามที่แสดงด้านบน: ไฟล์ที่มีเวอร์ชันแล้วจะไม่ถูกเพิกเฉย (แม้ว่าจะไม่มีนามสกุลก็ตาม) คนอื่น ๆ ทั้งหมดจะถูกละเว้น

สำหรับไฟล์ที่ไม่มีนามสกุลในอนาคตที่คุณต้องการเป็นเวอร์ชัน:

git add -f -- myFile

โปรดทราบว่ามีคอมไพล์ 2.9.x / 2.10 (กลาง 2016?) ก็อาจจะเป็นไปได้อีกครั้งรวมถึงไฟล์ถ้าไดเรกทอรีแม่ของไฟล์ที่ได้รับการยกเว้นในกรณีที่มีสัญลักษณ์แทนในเส้นทางใหม่รวมถึงไม่มี

NguyễnTháiNgọc Duy ( pclouds)กำลังพยายามเพิ่มคุณสมบัตินี้:

อย่างไรก็ตามเนื่องจากกฎข้อหนึ่งในการรวมเข้าใหม่คือ:

ส่วนไดเร็กทอรีในกฎการรวมซ้ำต้องเป็นตัวอักษร (เช่นไม่มีสัญลักษณ์แทน)

สิ่งนี้จะไม่ได้ผลที่นี่ต่อไป


1
คำตอบถูกต้องสมบูรณ์ แต่บางทีอาจจะดีกว่า.gitignoreที่จะเป็นและ** !**.*ฉันรู้ว่าสิ่งนี้ไม่ได้สร้างความแตกต่างหากวางดอกจันไว้ข้างหน้า แต่จะมีความชัดเจนและชัดเจนยิ่งขึ้นเมื่อเชลล์จัดการกับสัญลักษณ์แทน ...
Willem Van Onsem

7
หมายเหตุ: ในการทำงานกับกฎการยกเว้นอื่น ๆ จะต้องเป็นชุดกฎชุดแรกในไฟล์. gitignore ของคุณ
Erik

นอกจากนี้คุณยังสามารถรวมไฟล์ที่ไม่มีนามสกุลบางไฟล์อีกครั้งได้เช่นกับไฟล์!Makefile. ระวังว่าฉันประสบปัญหากับโซลูชันนี้ใน Git 1.7.1 ในขณะที่ใช้งานได้ดีใน 1.9.0 ในกรณีของฉันการเพิ่มไฟล์ในไดเร็กทอรีรูททำงานได้ดี แต่การเพิ่มไฟล์ที่มีนามสกุลภายในไดเร็กทอรีย่อยถูกแสดงว่าละเว้น ดูเหมือนว่าจะเป็นเพราะ 1.7.1 ยังไม่รองรับ**รูปแบบดูที่นี่ !
mxmlnkn

1
**ถูกเพิ่มเข้ามาใน 1.8.2Git มีข้อเสียมากกว่าการใช้!*/แทน!/**/หรือไม่?
mxmlnkn

@TamaMcGlinn ดูเหมือน regex: gitignore ไม่รองรับ regexes
VonC

50
*
!*/
!*.*

* บอกให้คอมไพล์ละเว้นทุกสิ่ง

!*/จากนั้นยกเลิกการให้ชื่อสิ่งที่เป็นไดเร็กทอรี นี่เป็นสิ่งสำคัญ

!*.* ยกเลิกการกำหนดไฟล์ทั้งหมดที่มีนามสกุล

หากไม่มี!*/กฎไดเรกทอรีที่ไม่มี.ชื่อจะไม่ปรากฏในรายการและจะไม่มีการเพิ่มไฟล์ที่คุณต้องการนอกโฟลเดอร์รูท

สำหรับการอ้างอิงโปรดอ่านสองส่วนนี้ในเอกสาร. gitignore ที่โดดเด่น:

คำนำหน้า "!" ซึ่งลบล้างรูปแบบ ไฟล์ที่ตรงกันใด ๆ ที่ถูกยกเว้นโดยรูปแบบก่อนหน้านี้จะรวมอีกครั้ง ไม่สามารถรวมไฟล์ใหม่ได้หากไม่รวมไดเร็กทอรีหลักของไฟล์นั้น Git ไม่แสดงรายการไดเรกทอรีที่ยกเว้นเนื่องจากเหตุผลด้านประสิทธิภาพดังนั้นรูปแบบใด ๆ ในไฟล์ที่มีจะไม่มีผลไม่ว่าจะกำหนดไว้ที่ใดก็ตาม ใส่แบ็กสแลช ("\") ไว้ข้างหน้า "!" อันแรก สำหรับรูปแบบที่ขึ้นต้นด้วยตัวอักษร "!" ตัวอย่างเช่น "! important! .txt"

หากรูปแบบลงท้ายด้วยเครื่องหมายทับจะถูกลบออกตามวัตถุประสงค์ของคำอธิบายต่อไปนี้ แต่จะพบเฉพาะไดเร็กทอรี กล่าวอีกนัยหนึ่ง foo / จะจับคู่ไดเร็กทอรี foo และพา ธ ที่อยู่ด้านล่าง แต่จะไม่ตรงกับไฟล์ปกติหรือลิงก์สัญลักษณ์ foo (ซึ่งสอดคล้องกับวิธีการทำงานของ pathspec โดยทั่วไปใน Git)


1
จับดี. +1. ฉันลืมอัปเดตคำตอบของฉันด้วยกฎนั้นที่ฉันเพิ่งใช้กับคำตอบอื่น ๆ ของเหมือง ฉันได้อัปเดตคำตอบของฉันตามนั้น
VonC

0

ในโฟลเดอร์ของฉันมีไฟล์มากมายที่มี*.c, *.h, *.txt, *.csvนามสกุลอื่น ๆ และไฟล์ไบนารีที่ไม่มีนามสกุลใด ๆ ดังนั้นฉันจึงต้องละเว้นไฟล์ทั้งหมดที่ถูก execpt *.c,*.hและ.gitignoreสิ่งนี้ใช้ได้กับฉันจาก.gitignoreตัวอย่าง:

 */*         #ignore all files in each directory
 !*/*.c      #unignore .c files in each directory
 !*/*.h      #unignore .h header files in each directory
 !.gitignore #unignore .gitignore
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.