อะไรคือความแตกต่างระหว่าง Git ที่ละเว้นไดเรกทอรีและไดเรกทอรี / *


108

ฉันสับสนเกี่ยวกับวิธีที่ถูกต้องในการละเว้นเนื้อหาของไดเร็กทอรีใน git คืออะไร

สมมติว่าฉันมีโครงสร้างไดเร็กทอรีต่อไปนี้:

my_project  
     |--www  
         |--1.txt  
         |--2.txt
     |--.gitignore

อะไรคือความแตกต่างระหว่างการใส่สิ่งนี้:

www

และนี่?

www/*

เหตุผลที่ฉันถามคำถามนี้คือใน git หากไดเร็กทอรีว่างเปล่า git จะไม่รวมไดเร็กทอรีว่างดังกล่าวไว้ในที่เก็บ ดังนั้นฉันจึงลองวิธีแก้ปัญหาที่เพิ่มไฟล์. gitkeep พิเศษภายใต้ไดเร็กทอรีเพื่อไม่ให้ว่างเปล่า เมื่อฉันลองวิธีแก้ปัญหานั้นหากอยู่ในไฟล์. gitignore ฉันเขียนดังนี้:

www
!*.gitkeep

ไม่ได้ผล (ความตั้งใจของฉันคือละเว้นเนื้อหาทั้งหมดภายใต้ www แต่เก็บไดเรกทอรีไว้) แต่ถ้าฉันลองทำสิ่งต่อไปนี้:

www/* 
!*.gitkeep

แล้วมันได้ผล! ดังนั้นฉันคิดว่ามันต้องมีความแตกต่างบางอย่างระหว่างสองแนวทางนี้


ความแตกต่างง่ายๆระหว่างbinและbin/คืออดีตจะไม่สนใจไฟล์หรือโฟลเดอร์โฟลเดอร์หลังเท่านั้น ฉันไม่รู้ความแตกต่างกับbin/*
Colonel Panic

คำตอบ:


203

มีความแตกต่างระหว่างกำลังwww, และwww/www/*

โดยทั่วไปจากเอกสารและการทดสอบของตัวเองwwwพบการแข่งขันกับไฟล์หรือไดเรกทอรี, www/เพียงตรงกับไดเรกทอรีในขณะที่ไดเรกทอรีการแข่งขันและไฟล์ภายในwww/*www

ฉันจะพูดถึงความแตกต่างระหว่างwww/และwww/*ที่นี่เท่านั้นเนื่องจากความแตกต่างระหว่างwwwและwww/ชัดเจน

สำหรับwww/git ละเว้นไดเร็กทอรีwwwเองซึ่งหมายความว่า git จะไม่มองเข้าไปข้างในด้วยซ้ำ แต่สำหรับwww/*การตรวจสอบคอมไพล์ไฟล์ทั้งหมด / โฟลเดอร์ภายในและละเว้นทั้งหมดของพวกเขาที่มีรูปแบบwww *ดูเหมือนว่าจะนำไปสู่ผลลัพธ์เดียวกันเนื่องจาก git จะไม่ติดตามโฟลเดอร์ที่ว่างเปล่าwwwหากไฟล์ / โฟลเดอร์ลูกทั้งหมดถูกละเว้น และแน่นอนผลลัพธ์จะไม่แตกต่างกันสำหรับกรณีของ OP ที่มีwww/หรือwww/*แบบสแตนด์อโลน แต่มันจะสร้างความแตกต่างหากรวมกับกฎอื่น ๆ

ตัวอย่างเช่นจะเกิดอะไรขึ้นหากเราต้องการรวมwww/1.txtแต่ไม่สนใจสิ่งอื่น ๆ ทั้งหมดภายในwww?

สิ่งต่อไปนี้.gitignoreจะไม่ทำงาน

www/
!www/1.txt

ในขณะที่.gitignoreผลงานต่อไปนี้ทำไม?

www/*
!www/1.txt

สำหรับคอมไพล์เดิมจะไม่สนใจไดเร็กทอรีwwwและจะไม่มองเข้าไปข้างในเพื่อรวมwww/1.txtอีก กฎข้อแรกจะไม่รวมไดเร็กทอรีหลักwwwแต่ไม่ใช่www/1.txtและด้วยเหตุwww/1.txtนี้จึงไม่สามารถ " รวมอีกครั้ง " ได้

แต่สำหรับหลังคอมไพล์ครั้งแรกละเว้นไฟล์ทั้งหมด / folers ภายใต้แล้วรวมถึงหนึ่งของพวกเขาอีกครั้งซึ่งเป็นwwwwww/1.txt

สำหรับตัวอย่างนี้บรรทัดต่อไปนี้ในเอกสารประกอบอาจช่วยได้:

คำนำหน้า "!" ซึ่งลบล้างรูปแบบ ไฟล์ที่ตรงกันใด ๆ ที่ถูกยกเว้นโดยรูปแบบก่อนหน้านี้จะรวมอีกครั้ง ไม่สามารถรวมไฟล์ใหม่ได้หากไม่รวมไดเร็กทอรีหลักของไฟล์นั้น


คุณไม่คิดอย่างwww/1.txtนั้นแล้วwww/จะทำเช่นเดียวกับแนวทางที่สอง ...
Naveed Butt

8

ฉันแค่แยกวิเคราะห์ผ่านเอกสารและเท่าที่ฉันบอกได้ว่ามันแตกต่างกันในรูปแบบขั้นสูงเท่านั้นเช่น

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

ฉันได้ทดสอบข้างต้นแล้วและหากคุณแทนที่!/fooด้วย!/foo/*คุณจะได้ผลลัพธ์ที่แตกต่างออกไป

บันทึก

foo

จะไม่รวมไฟล์ใด ๆfooแต่

foo/

จะยกเว้นไดเร็กทอรีที่ชื่อ foo เท่านั้น


3

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

ดังนั้นหากคุณต้องการที่จะไม่สนใจไฟล์ทั้งหมดที่อยู่ภายในwwwแต่ whant wwwโฟลเดอร์ที่จะ versioned แทนการใช้ที่ว่างเปล่า.gitkeep, .dummyหรืออะไรก็ตามที่คุณเลือกชื่อทำไมไม่ใช้.gitignoreมีบอกจะไม่สนใจไฟล์ทั้งหมดหรือไม่

/
|- .gitignore   (a)
\- www
    |- .gitignore   (b)
    |- 1.jpg
    \- 2.jpg

ในรูท.gitignore(a) คุณจะไม่พูดอะไรเกี่ยวกับwwwโฟลเดอร์หรือเนื้อหาในโฟลเดอร์

ในwww/.gitignore(b) คุณใส่สิ่งต่อไปนี้:

# ignore all files in this folder except this .gitignore
*
!.gitignore

วิธีนี้ทุกอย่างดูเป็นระเบียบมากขึ้น (อย่างน้อยสำหรับฉัน)


1

หากต้องการละเว้นทุกสิ่งในไดเร็กทอรียกเว้น dotfiles คุณสามารถใช้ glob-pattern ต่อไปนี้ใน.gitignore:

www/[^.]*

ไม่จำเป็นต้องมีอะไรเพิ่มเติม.gitignoreเพียงแค่เพิ่ม.keepไฟล์ลงในwwwไดเร็กทอรีของคุณ

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