รายการที่อนุญาตพิเศษและไดเรกทอรีย่อยใน Git


92

ฉันได้สร้างไวท์ลิสต์สำหรับไฟล์ข้อความเท่านั้น

*
!*.txt

ตอนนี้ฉันมีไฟล์ข้อความที่ไม่ได้ติดตามในไดเร็กทอรีย่อย - sub/dir/file.txtและสิ่งนี้จะไม่แสดง (จะถูกละเว้น) อย่างไรก็ตามไฟล์ข้อความในไดเร็กทอรีรากจะปรากฏขึ้น

ทำไมจึงเป็นเช่นนั้นและฉันจะแก้ไขได้อย่างไร


1
ที่เกี่ยวข้อง: stackoverflow.com/q/987142/78845
Johnsyweb

ไฟล์ที่คุณต้องการรวมไว้ในไดเรกทอรีย่อยหรือไม่ ในกรณีนี้ไดเรกทอรีย่อยนี้อาจถูกละเว้นโดยดาวแรกใน.gitignoreไฟล์.
fajran

ใช่. ไฟล์เหล่านี้จะมีโครงสร้างไดเร็กทอรีต่ำพอ ๆ กับโฟลเดอร์ 11.1.102.55 ในตัวอย่างของฉัน การซ้อนระหว่างโฟลเดอร์ / ผลิตภัณฑ์จะไม่เหมือนกันเสมอไป
เนท

1
ฉันรู้ถึงฟังก์ชันนี้ เรามีหลายร้อยไดเรกทอรี มันจะเร็วกว่าที่จะเพิกเฉยต่อประเภทไฟล์ที่เราไม่ต้องการอย่างชัดเจนมากกว่าการสร้าง gitignore หนึ่งรายการสำหรับแต่ละไดเร็กทอรี ฉันกำลังมองหาวิธีรับฟังก์ชันการอนุญาตพิเศษจากไฟล์. gitignore
เนท

1
ฉันไม่เห็นว่ามันซ้ำกันอย่างไร คำถามอื่นถามว่าจะอนุญาตไฟล์บางไฟล์ได้อย่างไรในขณะที่คำถามนี้ถามถึงวิธีการอนุญาตไฟล์บางประเภทรวมถึงโฟลเดอร์ย่อย จริงๆแล้วมันเหมือนซ้ำกันมากกว่าstackoverflow.com/questions/8024924/… .
Big McLargeHuge

คำตอบ:


148

หากคุณลองทำแบบนั้นมันจะล้มเหลวเพราะคุณจะต้องขึ้นบัญชีดำไดเรกทอรีในโครงสร้างของคุณ

เพื่อแก้ปัญหาที่คุณต้องการทุกอย่างในบัญชีดำที่ไม่ได้เป็นไดเรกทอรีและไม่ได้เป็นหนึ่งในประเภทของไฟล์ที่คุณต้องการที่จะกระทำในขณะที่ไม่ได้ขึ้นบัญชีดำไดเรกทอรี

.gitignoreไฟล์ที่จะทำเช่นนี้:

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

การทดสอบนี้ในโครงสร้างสามระดับสีขาวรายชื่อสำหรับ.txtไฟล์ในการปรากฏตัวของ*.one, *.twoและ*.threeไฟล์ที่ใช้.gitignoreอยู่ในไดเรกทอรีรากของพื้นที่เก็บข้อมูล - งานสำหรับฉัน คุณไม่ต้องเพิ่ม.gitignoreไฟล์ลงในไดเรกทอรีทั้งหมดในโครงสร้างของคุณ

ข้อมูลที่ฉันใช้ในการหาคำตอบนั้นมาจากสิ่งอื่น ๆ สิ่งนี้ (stackoverflow.com)


18
คุณต้องมีรายการ!.gitignoreเมื่อใช้*ใช่หรือไม่?
sjas

2
ดูคำตอบของฉันที่นี่: stackoverflow.com/questions/987142/… การใช้/*บัญชีดำเฉพาะโฟลเดอร์ระดับบนสุดอาจมีประโยชน์มากกว่าแต่ไม่ใช่ทุกโฟลเดอร์ที่เรียกซ้ำซึ่งหมายความว่า.gitignoreไม่ควรมองเข้าไปในโฟลเดอร์ย่อยของโฟลเดอร์ที่อนุญาตพิเศษ
Ryan Taylor

3

วิธีที่ง่ายกว่าในการบรรลุสิ่งนี้คือ:

# Ignore all files...
*.*

# ...except the ones we want
!*.txt

ใช้งานได้เนื่องจากgitignoreใช้รูปแบบที่ไม่ได้ขึ้นต้นด้วย/ทุกระดับด้านล่าง.gitignoreไฟล์:

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

หากคุณต้องการทำสิ่งนี้กับไฟล์ภายในไดเร็กทอรีสิ่งต่างๆจะซับซ้อนมากขึ้น:

# Ignore all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt

ใช้งานgitignoreได้เนื่องจากมีกฎพิเศษสำหรับ**:

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

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

ส่วนสำคัญคือเพื่อให้แน่ใจว่าคุณไม่ละเว้นไดเรกทอรีเพราะทุกไฟล์ในไดเรกทอรีนั้นจะถูกละเว้นโดยไม่คำนึงถึงกฎอื่น ๆ


0

ฉันค้นหามานาน:

  1. สมมติว่าฉันมีโครงสร้างโฟลเดอร์ขนาดใหญ่ที่มีไดเรกทอรี ~ 100.000 ซ้อนกันซ้ำ ๆ ในโฟลเดอร์เหล่านั้นมีไฟล์ประมาณ 30,000 ไฟล์.txt(ในกรณีของฉัน: type *.md) ถัดจาก*.mdไฟล์เหล่านี้มีไฟล์ 500GB (ล้าน +) ที่ฉันไม่ต้องการติดตาม

  2. ฉันต้องการให้คอมไพล์ติดตามเฉพาะ.txt(หรือ*.md) ไฟล์ในโฟลเดอร์และโฟลเดอร์ย่อยทั้งหมด

คำตอบที่ถูกต้องควรเป็น: ไม่สามารถทำได้ใน Git

สิ่งที่ฉันทำแทน:

[แก้ไข: ใช้งานไม่ได้เช่นกัน - ฉันพยายามสร้างโฟลเดอร์ที่มี symlinks (หรือฮาร์ดลิงก์) และใช้ git ที่นั่น แต่ git ไม่ทำตาม symlink และเขียนทับฮาร์ดลิงก์ Doh!]

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