gitignore ไฟล์ทั้งหมดของนามสกุลในไดเรกทอรี


192

มีวิธีละเว้นไฟล์ทั้งหมดในไดเรกทอรีหรือไม่?

** เห็นได้ชัดว่าไม่มีความหมายต่อคอมไพล์ดังนั้นจึงใช้งานไม่ได้:

/public/static/**/*.js

แนวคิดคือการจับคู่โฟลเดอร์ที่ซ้อนกันตามอำเภอใจ


คำตอบ:


123

ไม่เคยลอง แต่git help ignoreแนะนำว่าถ้าคุณใส่.gitignoreกับ*.jsใน/public/staticมันจะทำสิ่งที่คุณต้องการ

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


19
นั่นไม่จำเป็นต้องเป็นทางออกที่ดีที่สุด บุคคลที่มีศักยภาพจะต้องขุดผ่านไฟล์. gitignore ที่แตกต่างกันเพื่อค้นหาสาเหตุที่ไฟล์นั้นถูกละเว้น บางคนชอบที่มีข้อมูลทั้งหมดนี้ในไฟล์. gignignore หนึ่งไฟล์ที่เก็บไว้ในไดเรกทอรีราก repo
haren

1
@haren ไม่ใช่ทางออกเดียว - คำตอบของ Joey นั้นใช้ได้อย่างแน่นอนเช่นกัน เลือกสิ่งที่ดีที่สุดสำหรับคุณ ฉันขอยืนยันว่าไม่ควรวางกฎภายในลงในไดเรกทอรีควรอยู่ในไดเรกทอรีนั้นและกฎสากลนั้นควรเป็นสากล (นอกจากนี้คำตอบนี้โบราณและฉันไม่คิดว่า ** ได้รับการสนับสนุนในเวลานั้น)
ptyx

211

มันจะปรากฏว่า**ไวยากรณ์การสนับสนุนโดยgitเป็นรุ่น1.8.2.1ตามเอกสาร

เครื่องหมายดอกจัน (" **") สองอันติดต่อกันในรูปแบบที่ตรงกับชื่อพา ธ เต็มอาจมีความหมายพิเศษ:

  • เครื่องหมายนำหน้า " **" ตามด้วยเครื่องหมายสแลชหมายถึงตรงกันในไดเรกทอรีทั้งหมด ตัวอย่างเช่น " **/foo" จับคู่ไฟล์หรือไดเรกทอรี " foo" ได้ทุกที่เหมือนกับรูปแบบ " foo" " **/foo/bar" จับคู่ไฟล์หรือไดเรกทอรี " bar" ได้ทุกที่ที่อยู่ภายใต้ไดเรกทอรี " foo" โดยตรง

  • "" ต่อท้าย/**ตรงทุกอย่างที่อยู่ภายใน ตัวอย่างเช่น " abc/**" จับคู่ไฟล์ทั้งหมดในไดเรกทอรี " abc" สัมพันธ์กับตำแหน่งของ.gitignoreไฟล์โดยมีความลึกไม่ จำกัด

  • เครื่องหมายทับแล้วตามด้วยเครื่องหมายดอกจันสองตัวต่อจากนั้นเครื่องหมายทับจะจับคู่กับไดเรกทอรีอย่างน้อยหนึ่งไดเรกทอรี ตัวอย่างเช่น " a/**/b" จับคู่ " a/b", " a/x/b", " a/x/y/b" และอื่น ๆ

  • เครื่องหมายดอกจันอื่น ๆ ที่ต่อเนื่องกันถือว่าไม่ถูกต้อง


1
ความแตกต่างระหว่างxxx/**และxxx/คืออะไร
thuzhf

9
xxx/**กำหนดเป้าหมายไฟล์และไดเรกทอรีทั้งหมดในxxxขณะที่xxx/กำหนดเป้าหมายxxxไดเรกทอรีโดยตรง สิ่งนี้สำคัญมากเมื่อลบรูปแบบด้วย!ในฐานะ "ไม่สามารถรวมไฟล์อีกครั้งได้หากไม่รวมไดเรกทอรีหลักของไฟล์นั้น" ดังนั้นการใช้xxx/*หรือxxx/**จำเป็นในกรณีนั้น
joeyhoer

4
ไฟล์ทั้งหมดที่มี .meta ตอนท้ายควรถูกละเว้นโดย git มันทำงานอย่างไร **.js?
Black

"เครื่องหมายดอกจันอื่น ๆ ที่ต่อเนื่องกันถือว่าไม่ถูกต้อง" ผลรวมทั้งหมด
imrok

68

อัปเดต: ดูที่คำตอบของ @ Joey : Git สนับสนุน**ไวยากรณ์ในรูปแบบแล้ว วิธีการทั้งสองควรทำงานได้ดี


gitignore (5) หน้าคนฯ :

รูปแบบที่อ่านจากไฟล์. gitignore ในไดเรกทอรีเดียวกันกับพา ธ หรือในพาเรนต์พาเรนต์ใด ๆ ที่มีรูปแบบในไฟล์ระดับที่สูงกว่า มีไฟล์

สิ่งนี้หมายความว่ารูปแบบใน.gitignoreไฟล์ในไดเรกทอรีใด ๆ ของ repo ของคุณจะมีผลกับไดเรกทอรีนั้นและไดเรกทอรีย่อยทั้งหมดไดเรกทอรีย่อยทั้งหมด

รูปแบบที่คุณให้ไว้

/public/static/**/*.js

ไม่ถูกต้องประการแรกเนื่องจาก (ตามที่คุณบันทึกไว้อย่างถูกต้อง) **ไวยากรณ์ไม่ได้ถูกใช้โดย Git นอกจากนี้/แองเคอร์ชั้นนำที่มีรูปแบบเพื่อเริ่มต้นชื่อพา ธ (ดังนั้น/public/static/*.jsจะตรง/public/static/foo.jsแต่ไม่ /public/static/foo/bar.js .) การถอดชั้นนำ/จะไม่ทำงานอย่างใดอย่างหนึ่งที่ตรงกับเส้นทางที่เหมือนและpublic/static/foo.js foo/public/static/bar.jsแก้ไข: เพียงแค่เอาเครื่องหมายทับนำหน้าจะไม่ทำงานเช่นกัน - เนื่องจากรูปแบบยังคงมีเครื่องหมายทับอยู่จึงได้รับการปฏิบัติโดย Git ในรูปแบบเปลือกทรงกลมแบบไม่เรียกซ้ำ (ขอบคุณ@Joey Hoerเพื่อชี้เรื่องนี้)

ตามที่ @ptyx แนะนำสิ่งที่คุณต้องทำคือสร้างไฟล์<repo>/public/static/.gitignoreและรวมเพียงรูปแบบนี้:

*.js

ไม่มีการนำ/หน้าดังนั้นจึงจะจับคู่ที่ส่วนใดส่วนหนึ่งของเส้นทางและรูปแบบนั้นจะถูกนำไปใช้กับไฟล์ใน/public/staticไดเรกทอรีและไดเรกทอรีย่อยเท่านั้น


2
สิ่งนี้ไม่เป็นความจริงเลยโดยเฉพาะในส่วน "การลบผู้นำที่/จะไม่ทำงานเช่นเดียวกับเส้นทางที่ตรงกันpublic/static/foo.jsและfoo/public/static/bar.js" เป็นเท็จ ในการอ้างอิงเอกสาร "ถ้ารูปแบบไม่มีเครื่องหมายทับ /, Git จะถือว่าเป็นรูปแบบเชลล์แบบกลมและตรวจสอบการจับคู่กับชื่อพา ธ ที่สัมพันธ์กับตำแหน่งของไฟล์. gitignore (สัมพันธ์กับระดับบนของแผนผังงานถ้า ไม่ได้มาจากไฟล์. gitignore) " จะไม่ได้รับการจับคู่เพราะรูปแบบไม่มีfoo/public/static/bar.js /
joeyhoer

@JoeyHoer ขอบคุณคำแนะนำฉันได้อัปเดตคำตอบของฉันแล้ว
Adam คม

9

หากต้องการเพิกเฉยไฟล์ที่ไม่ได้ติดตามให้ไปที่. git / info / แยก ยกเว้นเป็นไฟล์ที่มีรายการนามสกุลหรือไฟล์ที่ถูกละเว้น


2
สิ่งนี้จะไม่ส่งต่อไปยังโคลนอื่น ๆ ของที่เก็บเช่น. gitignore จะ (หลังจากถูกยืนยันแน่นอน)
jpmc26

3

findผมเชื่อว่าทางออกที่ง่ายที่สุดที่จะใช้ ฉันไม่ชอบที่จะมีหลาย ๆรอบที่แขวนอยู่ในไดเรกทอรีย่อยและฉันชอบที่จะจัดการที่ไม่ซ้ำกันระดับบนสุด.gitignore ต้องการทำเช่นนั้นคุณก็สามารถผนวกไฟล์ที่พบเพื่อคุณ.gitignore .gitignoreหากว่าบ้าน/public/static/ของคุณเป็นโครงการ / คอมไพล์ฉันจะใช้:

find . -type f -name *.js | cut -c 3- >> .gitignore

ฉันพบว่าการตัด./จุดเริ่มต้นมักจำเป็นสำหรับ git เพื่อทำความเข้าใจว่าควรหลีกเลี่ยงไฟล์ใด cut -c 3-ดังนั้น

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