ฉันจะบอกให้ Git เพิกเฉยทุกอย่างได้อย่างไรยกเว้นไดเรกทอรีย่อย


218

ฉันต้องการละเว้นไฟล์ทั้งหมดในที่เก็บของฉันยกเว้นไฟล์ที่เกิดขึ้นในbinไดเรกทอรีย่อย ฉันพยายามเพิ่มสิ่งต่อไปนี้ในของฉัน.gitignore:

*
!bin/*

สิ่งนี้ไม่มีผลตามที่ต้องการอย่างไรก็ตามฉันสร้างไฟล์ใหม่ที่อยู่ภายในbin/แต่git statusยังคงแสดงnothing to commit (working directory clean)อยู่

ข้อเสนอแนะใด ๆ


คำตอบ:


273

สิ่งนี้จะไม่สนใจไฟล์รูทและไดเรกทอรีรูทจากนั้นให้ยกเลิกการลบไดเร็กทอรีรูท:

/*
/*/
!/bin/

วิธีนี้คุณจะได้รับไดเรกทอรี bin ทั้งหมดรวมถึงไดเรกทอรีย่อยและไฟล์ของพวกเขา


25
ด้วยเหตุผลบางอย่างมันใช้งานไม่ได้สำหรับฉัน ฉันมีสองเส้น/stuff/และ!/stuff/specific/แต่ก็ยังไม่สนใจสิ่งที่ / / เฉพาะ /
LB--

1
@ LB-- ฉันมีปัญหาที่คล้ายกันและgit check-ignore -vบอกฉันว่ามันเป็นเพราะ~/.gitignore
เกอร์นีย์ alex

@gurneyalex ฉันพบว่ามันแก้ไขตัวเองถ้าฉันลบ repo ในพื้นที่และทำการโคลนซ้ำมันต้องเป็นบั๊ก
LB

2
/ * / จำเป็นหรือไม่
Alex Baker

3
สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันต้องเพิ่มไฟล์!/bin/รูทของฉัน.gitignoreแต่หลังจากนั้นฉันต้องเพิ่ม/bin/.gitignoreไฟล์ด้วย!*... การเปลี่ยนแปลงอย่างใดอย่างหนึ่งเท่านั้นไม่ได้ผล ใช้งานได้หลังจากรวมการเปลี่ยนแปลงทั้งสองแล้วเท่านั้น
เฟลิเป้บราห์ม

113

ต่อไปนี้เป็นวิธีละเว้นทุกสิ่งที่ยกเว้นหนึ่งไดเรกทอรี " MY_SUPER_DUPER_TEMPLATE_directory " ในบางไดเรกทอรี

โครงสร้าง: / bitrix / templates / MY_SUPER_DUPER_TEMPLATE_directory

/*
!/bitrix
/bitrix/*
!/bitrix/templates
/bitrix/templates/*
!/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory
*.DS_Store
*.gitignore

1
สิ่งนี้ทำงานได้อย่างมหัศจรรย์สำหรับการยกเลิกการลงทะเบียนแพ็คเกจผู้จำหน่าย laravel ที่ฉันได้แก้ไข! ขอบคุณคุณช่วยฉันปวดหัวจำนวนมาก
Maria Vilaró

ควรเลือกคำตอบนี้เป็นคำตอบที่ดีที่สุด
Bahman.A

63

คุณต้องยกเว้นทุกอย่างที่ไปยังจุดหมายปลายทาง แต่คุณต้องรวมปลายทาง:

หมายเหตุ: ไฟล์นี้เป็นไฟล์แยก (เช่น. gitignore) เพื่อลอจิกกลับด้าน ละเว้นทั้งหมดยกเว้นไดเรกทอรี tsp ละเว้นทั้งหมดในไดเรกทอรี tsp ยกเว้นไดเรกทอรี src ...

/*
!/tsp
/tsp/*
!/tsp/src
/tsp/src/*
!/tsp/src/*.h
!/tsp/src/*.cpp
!/tsp/src/data.txt
!/.gitignore

11
+1 สำหรับหลักการของการรวมไดเรกทอรีจากนั้นไม่รวมเนื้อหาแล้วรวมถึงไดเรกทอรีย่อยที่ต้องการ ฯลฯ ฉันลงเอยด้วยการใช้คำตอบนี้ในโครงการของฉัน
John Jesus

40

ปัญหาเดียวที่คุณมีคือbinไดเรกทอรีนั้นไม่ตรงกับbin/*รูปแบบดังนั้น git จึงไม่แม้แต่มองในbinไดเรกทอรี

มีวิธีแก้ปัญหาสองประการที่ผุดขึ้นในใจ

.gitignore :

*
!/bin/
!bin/*

หรือ

.gitignore :

*
!/bin/

bin/.gitignore :

!*

ฉันชอบวิธีการแก้ปัญหาที่สองเป็นวิธีแรกจะไม่หยุดการละเว้นแฟ้มในไดเรกทอรีที่อยู่ในไดเรกทอรีย่อยที่ไม่ได้เรียกว่าbin binสิ่งนี้อาจจะมีหรือไม่มีความสำคัญในสถานการณ์ของคุณ


2
ไม่ได้ผลสำหรับฉัน ฉันต้องมี. gignignore แบบนี้เพื่อให้มันใช้งานได้: # Ignore everything * # But not these files... !/wp-content/ !/wp-content/plugins/ !/wp-content/plugins/my_plugin/ !/wp-content/plugins/my_plugin/* ไม่มีรหัสบล็อกในความคิดเห็น?
xlttj

1
คำตอบของ Tylerมีการแก้ปัญหาไฟล์เดี่ยวที่ดีกว่า
Yarin

19

จากเอกสาร gitอย่างเป็นทางการตัวอย่างหนึ่งกล่าวว่า:

ตัวอย่างการยกเว้นทุกอย่างยกเว้นไดเรกทอรีเฉพาะ foo / bar (สังเกต / * - โดยไม่มีเครื่องหมายทับ, wildcard จะยกเว้นทุกอย่างภายใน foo / bar):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

สำหรับคำอธิบายเกี่ยวกับการเฉือนชั้นนำ: เมื่อใช้เฉือนชั้นนำใน gitignore


ขอบคุณล้านสิ่งนี้ใช้ได้สำหรับฉัน! โปรดทราบว่าลำดับของบรรทัดที่นี่มีความสำคัญคุณไม่สามารถมี! / foo / bar ก่อน / foo / * ตัวอย่างเช่น
Iamsodarncool


11

ฉันคิดว่าวิธีที่ดีกว่าคือการยึดแต่ละรูปแบบกับไดเรกทอรี git อันดับต้นโดยเริ่มต้นรูปแบบด้วยเครื่องหมายทับ:

/*
!/public_html
!/.gitignore

แทนที่จะเพิกเฉยไฟล์ทั้งหมดมันจะละเว้นไฟล์ระดับบนสุดเท่านั้นไม่ใช่ไฟล์ในไดเรกทอรีที่คุณไม่ต้องการเพิกเฉย




0

ฉันต้องทำสิ่งนี้เมื่อเร็ว ๆ นี้:

*
!sub-dir/
!sub-dir/*

ฉันไม่แน่ใจว่าทำไมฉันต้องมีสองบรรทัดเพื่อแยกโฟลเดอร์เดียว แต่นี่คือสิ่งที่ใช้ได้กับฉันและ macos

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