เมื่อใดควรใช้เครื่องหมายทับใน gitignore


111

ฉันพยายามทำความเข้าใจ.gitignoreไวยากรณ์ให้ชัดเจนยิ่งขึ้นและโดยเฉพาะอย่างยิ่งเท่าที่เกี่ยวข้องกับhttps://github.com/github/gitignore gitignores

ฉันเห็นว่าเครื่องหมายทับนำหน้าใช้เพื่อจับคู่เฉพาะชื่อพา ธ ที่สัมพันธ์กับตำแหน่งของ.gitignoreไฟล์ (จากhttp://git-scm.com/docs/gitignore ):

เครื่องหมายทับนำหน้าตรงกับจุดเริ่มต้นของชื่อพา ธ ตัวอย่างเช่น "/*.c" ตรงกับ "cat-file.c" แต่ไม่ใช่ "mozilla-sha1 / sha1.c"

แต่จะเกิดอะไรขึ้นเมื่อฉันลบเครื่องหมายทับ เท่าที่ฉันเข้าใจมีสองกรณี:

  1. หากรูปแบบไม่มีเครื่องหมายทับ (หรือมีเพียงเครื่องหมายทับซึ่งหมายความว่าควรตรงกับไดเร็กทอรี) การค้นหาจะดำเนินการภายในแผนผังไดเร็กทอรีทั้งหมด ตัวอย่างเช่นรูปแบบdir/จะตรงกับ<root>/dir, <root>/a/dir, <root>/a/b/c/.../dirและอื่น ๆ ที่<root>เป็นที่ตั้งของ.gitignoreไฟล์
  2. หากรูปแบบมีเครื่องหมายทับซึ่งไม่อยู่ในตำแหน่งต่อท้าย (ไม่ใช่อักขระตัวสุดท้าย) รูปแบบนั้นจะจับคู่กับชื่อพา ธ ที่สัมพันธ์กับตำแหน่ง.gitignoreไฟล์เท่านั้น

นี่คือตัวอย่างที่ฉันทำขึ้นเพื่อตรวจสอบพฤติกรรมนี้:

# Directory structure:
<root>
├─ dir/
│   └─ test
├─ src/
│   ├─ dir/
│   │   └─ test
test file is there only because Git does not track empty directories.

การทดสอบครั้งแรก:

# .gitignore
dir/

# git status
nothing to commit

ดังนั้น Git จึงไม่สนใจdirไดเรกทอรีทั้งสอง สิ่งนี้สอดคล้องกับกรณีหมายเลข 1: รูปแบบไม่มีเครื่องหมายทับ (ยกเว้นแบบต่อท้าย) ดังนั้น Git จึงเฝ้าดูแผนผังไดเรกทอรีทั้งหมดโดยไม่สนใจทุกอย่างที่ตรงกับรูปแบบ

การทดสอบครั้งที่สอง:

# .gitignore
/dir/

# git status
Untracked files:
    src/

ที่นี่ Git จะละเว้นเฉพาะdirไดเร็กทอรีที่อยู่ใต้ไดเร็กทอรีรูทโดยตรงโดยใช้เครื่องหมายทับในรูปแบบ

การทดสอบครั้งที่สาม:

# .gitignore
dir/*

# git status
Untracked files:
    src/

สิ่งนี้สอดคล้องกับกรณีที่ 2: รูปแบบมีเครื่องหมายทับอยู่ภายในดังนั้นจึงถือว่าเป็นชื่อพา ธ ที่เริ่มต้นจากไดเรกทอรีราก

ตอนนี้ถึงเวลาสำหรับคำถามที่แท้จริง ลองพิจารณาไฟล์ gitignore นี้ : เมื่อพวกเขาเพิกเฉยต่อไดเร็กทอรีdownloader/ตัวอย่างเช่นพวกเขาไม่สนใจทุกdownloaderไดเร็กทอรีเดียวที่พบในแผนผังไดเร็กทอรีทั้งหมดใช่หรือไม่ นี่คือสิ่งที่ฉันถูกผลักดันให้คิดตั้งแต่สิ่งที่ฉันเห็นเกี่ยวกับการทำงานของ Git มาก่อน

ดังนั้นหากฉันมีโมดูลแบบกำหนดเองที่มีdownloaderไดเร็กทอรีอยู่ภายในโมดูลนั้นจะถูกละเว้นโดยไม่คาดคิดเช่นเดียวกับโมดูลปกติในรูทของ Magento หรือไม่ นี่เป็นคำถามที่เข้าใจผิดเพราะมันเคยเกิดขึ้นแล้วกับฉันทำให้เกิดข้อผิดพลาดที่ยากมาก

ดังนั้นใน.gitignoreไฟล์Magento (ซึ่งฉันอ้างถึงเป็นเพียงตัวอย่างเท่านั้น btw) รูปแบบจำนวนมากมีเครื่องหมายทับดังนั้นจึงจับคู่ได้อย่างถูกต้องกับชื่อพา ธ ที่เริ่มต้นจากรูท แต่มีบางกรณีเช่นdownloader/หรือerrors/นั้น ถ้าฉันไม่ผิดอาจเป็นอันตรายและที่ควรอาจจะเปลี่ยนไปและ/downloader//errors/

ตามคำถามทั่วไปฉันควรใช้สแลชนำหน้าเสมอสำหรับรูปแบบที่ไม่มีเครื่องหมายทับ (ยกเว้นเครื่องหมายทับ) เมื่อฉันต้องการเลือกชื่อพา ธ โดยเริ่มจากรูทอย่างชัดเจนและไม่ควรใช้สำหรับรูปแบบที่มีเครื่องหมายทับหรือฉันควร ใช้เครื่องหมายทับเสมอเพื่อความชัดเจน? คุณคิดอย่างไรกับมัน?

ขอบคุณที่อ่านและขอโทษที่โพสต์ยาว


8
คำถามที่ยอดเยี่ยมและคำอธิบายที่ดีจริงๆฉันก็กังวลกับเรื่องนี้เช่นกันและงานวิจัยของคุณทำให้ฉันเข้าใจได้ชัดเจน หลังจากอ่านสิ่งนี้ฉันจะบอกว่าเป็นแนวทางปฏิบัติที่ดีที่จะเริ่มเส้นทางด้วยเครื่องหมายทับหากควรเริ่มจากรูทจะทำให้ความตั้งใจชัดเจนขึ้น
Martinsos

4
ขอบคุณ :) ฉันเห็นด้วยกับบันทึกของคุณเกี่ยวกับการใช้เครื่องหมายทับเพื่อทำให้เจตนาชัดเจนยิ่งขึ้น
swahnee

8
นี่ควรเป็นส่วนหนึ่งของเอกสาร. gitignore เข้าใจง่ายกว่าเยอะ!
rmorrin

ฉันชอบที่จะเห็นโพสต์ที่ยอดเยี่ยมนี้แบ่งออกเป็นส่วนคำถามและคำตอบ ...
บาเร็ตต์

คำตอบ:


27

เพียงแค่ต้องการสรุปสำหรับการอ้างอิงในอนาคตอย่างรวดเร็วที่เป็นไปได้ - เครื่องหมายทับที่นำไปสู่การจับคู่กับรูท ดังนั้นในตัวอย่างด้านล่างหากไม่มีเครื่องหมายทับสัญลักษณ์แทนก็จะยกเว้นทุกอย่างภายใน foo ด้วยเพราะมันจะใช้เวลา*และเคลื่อนไปตามต้นไม้ซ้ำ ๆ อย่างไรก็ตามด้วย/*จะไม่รวมทุกอย่างยกเว้นโฟลเดอร์ foo และเนื้อหา:

$ cat .gitignore
/*
!/foo

25

คุณได้ตอบคำถามของคุณเองทั้งหมดแล้ว หากคุณดูที่ github / gitignore repo อย่างใกล้ชิดมากขึ้นคุณจะเห็นไฟล์ส่วนใหญ่ใช้กฎที่ไม่สอดคล้องกันเกี่ยวกับวิธีการเขียนรูปแบบ เป็นไปได้มากว่ามีส่วนร่วมโดยผู้ที่ไม่รำคาญที่จะอ่านเอกสารหรือทดสอบสิ่งต่างๆเหมือนที่คุณทำ

ดังนั้นหากช่วยได้: คุณพูดถูกต้องมั่นใจ

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

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