มีหลาย `gitignore`s ขมวดคิ้วใน?


239

เว้นแต่ repo ประกอบด้วยโครงการอิสระหลายโครงการดูเหมือนว่าจะง่ายที่สุดที่จะมีเพียง.gitignoreไฟล์เดียวที่รูทของ repo มากกว่าโครงการอื่น ๆ มีวิธีปฏิบัติที่เป็นมาตรฐานที่ดีที่สุดสำหรับการวิเคราะห์นี้หรือออนไลน์เมื่อใดที่วิธีการหนึ่งดีกว่าวิธีอื่น?

คำตอบ:


254

ฉันสามารถคิดถึงอย่างน้อยสองสถานการณ์ที่คุณต้องการมีหลาย.gitignoreไฟล์ในไดเรกทอรี (ย่อย) ที่แตกต่างกัน

  • ไดเร็กทอรีที่ต่างกันมีไฟล์ประเภทต่าง ๆ ที่ต้องเพิกเฉย ตัวอย่างเช่น.gitignoreในไดเรกทอรีบนสุดของโครงการของคุณละเว้นโปรแกรมที่สร้างขึ้นในขณะที่Documentation/.gitignoreละเว้นเอกสารที่สร้างขึ้น

  • ไม่ต้องสนใจไฟล์ที่กำหนดในไดเรกทอรี (sub) ที่ให้ไว้เท่านั้น (คุณสามารถใช้/sub/fooใน.gitignore)

โปรดจำไว้ว่ารูปแบบใน.gitignoreไฟล์จะใช้ซ้ำกับไดเรกทอรี (ย่อย) ไฟล์ที่อยู่ในและไดเรกทอรีย่อยทั้งหมดยกเว้นรูปแบบที่มี '/' (เช่นรูปแบบที่nameใช้กับไฟล์ใด ๆ ที่มีชื่อnameในไดเรกทอรีที่กำหนดและไดเรกทอรีย่อยทั้งหมดในขณะที่/nameใช้กับไฟล์ ด้วยชื่อนี้เท่านั้นในไดเรกทอรีที่กำหนด)


1
อ่าด้วยเหตุผลบางอย่างฉันคิดว่า / เอกสาร / /.html จะครอบคลุมเรื่องนี้ แต่ฉันเดาว่า * wild card จะจับคู่ไดเรกทอรีที่ระดับเดียวเท่านั้น
Conley Owens

9
@ConleyOwens: ที่ทันสมัย Git คุณสามารถใช้Documentation/**/*.html(หมายเหตุว่าเบรกเฉือนรูปแบบนั้น/fooจะใช้ในการยึดไฟล์โดยตรงใน directory)
ยาคุบบNarębski

97

ในฐานะโน้ตสัมผัสวงหนึ่งกรณีที่ความสามารถในการมีหลาย.gitignoreไฟล์นั้นมีประโยชน์มากคือถ้าคุณต้องการไดเร็กตอรี่พิเศษในสำเนาการทำงานที่คุณไม่ต้องการกระทำ เพียงแค่ใส่ 1 ไบต์.gitignore(มีเพียงดอกจันเดียว) ในไดเรกทอรีนั้นและมันจะไม่ปรากฏขึ้นในgit statusฯลฯ


4
คุณยังสามารถใช้ไฟล์ "
.git

10
แน่นอนว่าถ้าคุณไม่รังเกียจที่จะต้องเปิดไฟล์ในที่ใดที่หนึ่งที่อยู่นอกรูทที่เก็บข้อมูลจากนั้นให้เขียนเส้นทางทั้งหมดลงไปจากนั้นจึงจดจำการล้างรายการถ้า / เมื่อคุณลบไดเรกทอรี เปรียบเทียบกับprintf \* > .gitignore(การล้างข้อมูลนั้นเป็นไปโดยอัตโนมัติเมื่อคุณลบไดเรกทอรี) ฉันแน่ใจว่ามีสถานการณ์ที่.git/info/excludeเป็นตัวเลือกที่เหมาะสมกว่า แต่ไม่มากนัก
อริสโตเติล Pagaltzis

ใช่เมื่อคุณต้องการยกเว้นไฟล์แทนที่จะเป็นโฟลเดอร์เช่น: p
Ayell

4
ฉันพูดว่า“ ถ้าคุณต้องการไดเรกทอรีพิเศษในสำเนางานของคุณที่คุณไม่เคยตั้งใจจะทำ” ในคำตอบของฉัน
อริสโตเติล Pagaltzis

1
เนื่องจากมันสร้างความยุ่งเหยิงน้อยลงในรูตของ. gignignore ฉันชอบวิธีนี้มาก
David A. Gray

59

คุณสามารถมีได้หลายรายการ.gitignoreแต่ละหลักสูตรในไดเรกทอรีของตัวเอง
ในการตรวจสอบกฎ gitignore ที่รับผิดชอบการเพิกเฉยไฟล์ให้ใช้git check-ignore: git check-ignore -v -- afile.

และคุณสามารถมีรุ่นที่แตกต่างของ.gitignoreไฟล์ต่อสาขา: ผมได้เห็นแล้วว่าจะมีการกำหนดค่าสำหรับการสร้างความมั่นใจสาขาหนึ่งละเว้นไฟล์ในขณะที่สาขาอื่น ๆ ที่ไม่ได้: เห็นนี้คำถามเช่น

หาก repo ของคุณรวมถึงโครงการหลายชาติก็จะดีที่สุดที่จะอ้างอิงพวกเขาเป็นsubmodulesแม้ว่า
นั่นจะเป็นแนวปฏิบัติที่ดีที่สุดที่แท้จริงช่วยให้แต่ละโครงการเหล่านั้นสามารถทำการโคลนได้อย่างอิสระ (พร้อม.gitignoreไฟล์ที่เกี่ยวข้อง) ในขณะที่ถูกอ้างอิงโดยการแก้ไขเฉพาะในโครงการหลักระดับโลก
ดูธรรมชาติที่แท้จริงของ submodulesเพิ่มเติม


โปรดทราบว่าเนื่องจาก git 1.8.2 (มีนาคม 2013) คุณสามารถทำgit check-ignore -v -- yourfileเพื่อดูว่าการรัน gitignore ใด (จาก.gitignoreไฟล์ใด) ที่ใช้กับ ' yourfile' และเข้าใจได้ดีขึ้นว่าเหตุใดไฟล์ดังกล่าวจึงถูกละเว้น
โปรดดูที่ " ซึ่งgitignoreกฎละเลยไฟล์ของฉันได้อย่างไร "


17

โปรเดียว

  • หาง่าย

  • การตามล่ากฎการแยกตัวออกอาจเป็นเรื่องยากถ้าฉันมี gitignore หลายตัวในหลาย ๆ ระดับใน repo

  • ด้วยหลายไฟล์คุณมักจะจบลงด้วยความซ้ำซ้อน

หลายโปร

  • กำหนดขอบเขต "ความรู้" ให้กับส่วนของแผนผังไฟล์ที่จำเป็น

  • เนื่องจาก Git ติดตามเฉพาะไฟล์ไฟล์. gitignore ที่ว่างเปล่าเป็นวิธีเดียวในการคอมมิทไดเรกทอรี "empty"

    (และก่อนหน้า Git 1.8 วิธีเดียวที่จะยกเว้นรูปแบบที่เหมือนกันmy/**.exampleคือสร้างmy/.gitignoreด้วยรูปแบบ**.fooเหตุผลนี้ไม่สามารถใช้ได้ในตอนนี้เท่าที่คุณสามารถทำได้/my/**/*.example)


ฉันชอบไฟล์เดียวมากซึ่งฉันสามารถค้นหาการยกเว้นทั้งหมดได้ ฉันไม่เคยพลาดไดเรกทอรีต่อ. svn และฉันจะไม่พลาดไดเรกทอรีต่อ. gitignore เช่นกัน

ที่กล่าวว่า gitignores หลายคนค่อนข้างบ่อย หากคุณใช้มันอย่างน้อยก็ควรใช้อย่างสม่ำเสมอเพื่อให้เหมาะสมกับการทำงาน ตัวอย่างเช่นคุณอาจวางไว้ในไดเรกทอรีเพียงหนึ่งระดับจากรูท


". gitignore ที่ว่างเปล่าเป็นวิธีเดียวในการคอมมิทไดเรกทอรี" empty " จริงๆแล้วฉันพบว่าการอัปโหลดไฟล์ README ไฟล์เดียว (หรือไฟล์ที่มีชื่อemptyสำหรับเรื่องนั้น) นั้นเป็นเรื่องธรรมดา
Marc.2377

6
.itkeep เป็นวิธีที่ดีในการทำเช่นนี้ ... เพียงแค่การประชุมอื่น ฉันชอบแนวคิดของการใช้ไฟล์ readme เพราะคุณสามารถอธิบายสิ่งที่ไดเรกทอรีใช้สำหรับไฟล์ read me นั้นได้
Gavin Pickin

8

มีสถานการณ์มากมายที่คุณต้องการที่จะกระทำไดเรกทอรีเพื่อ repo Git ของคุณ แต่ไม่มีไฟล์ในนั้นเช่นมีlogs, cache, uploadsไดเรกทอรี ฯลฯ

ดังนั้นสิ่งที่ฉันทำเสมอคือการเพิ่ม.gitignoreไฟล์ในไดเรกทอรีเหล่านั้นด้วยเนื้อหาต่อไปนี้:

*
!.gitignore

ด้วย.gitignoreไฟล์นี้Git จะไม่ติดตามไฟล์ใด ๆ ในไดเรกทอรีเหล่านั้น แต่ก็ยังอนุญาตให้ฉันเพิ่ม.gitignoreไฟล์และด้วยเหตุนี้ไดเรกทอรีจึงไปยัง repo

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