ทำให้. gitignore ละเว้นทุกสิ่งยกเว้นไฟล์บางไฟล์


1700

ฉันเข้าใจว่าไฟล์. gitignore ปกปิดไฟล์ที่ระบุจากการควบคุมเวอร์ชันของ Git ฉันมีโครงการ (LaTeX) ที่สร้างไฟล์พิเศษจำนวนมาก (. auth, .dvi, .pdf, บันทึก ฯลฯ ) ในขณะที่ทำงาน แต่ฉันไม่ต้องการให้มีการติดตาม

ฉันรู้ว่าฉันสามารถ (อาจจะควร) ทำมันเพื่อให้ไฟล์เหล่านั้นทั้งหมดถูกวางไว้ในโฟลเดอร์ย่อยแยกต่างหากในโครงการเนื่องจากฉันสามารถข้ามโฟลเดอร์ได้

อย่างไรก็ตามมีวิธีใดที่เป็นไปได้ในการเก็บไฟล์เอาท์พุทในรากของแผนผังโครงการและใช้. gitignore เพื่อละเว้นทุกอย่างยกเว้นไฟล์ที่ฉันกำลังติดตามด้วย Git? สิ่งที่ต้องการ

# Ignore everything
*

# But not these files...
script.pl
template.latex
# etc...

12
ทำซ้ำของstackoverflow.com/q/9162919/321973 (ฉันรู้ว่ามันใหม่กว่า แต่คำตอบมีความถูกต้องมากขึ้น) จริงๆแล้วคำตอบนี้น่าจะดีที่สุด
Tobias Kienzler

คำตอบ:


2441

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

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# ...even if they are in subdirectories
!*/

# if the files to be tracked are in subdirectories
!*/a/b/file1.txt
!*/a/b/c/*

14
ดูเหมือนว่าจะไม่สนใจโฟลเดอร์ย่อยเช่นว่าไฟล์ใด ๆ ที่ชื่อว่า 'script.pl' ในสิ่งอื่นที่ไม่ใช่รูต dir จะไม่ถูกค้นพบ ฉันกำลังใช้งานอยู่ตอนนี้ (พร้อม * .pl) และไฟล์ * .pl ทั้งหมดจะถูกเพิกเฉยแม้ว่าจะมีหลายรายการในไดเรกทอรีย่อยด้านล่างไฟล์. gitignore
PandaWood

38
@PandaWood ปัญหานี้เกิดขึ้นที่นี่ (stackoverflow.com) มันเกิดจากการแสดงออกครั้งแรกที่ตรงกับทุกอย่างรวมถึงไดเรกทอรีซึ่งคุณไม่เคยปฏิเสธ ในการแก้ไขให้เพิ่ม (! * /) ซึ่งตรงกับไดเรกทอรีย่อยใด ๆ (เรียกซ้ำ) ในไดเรกทอรีปัจจุบัน วิธีนี้จะไม่ช่วยคำตอบหลักซึ่งเป็นไฟล์เฉพาะที่อนุญาตพิเศษ (หากอยู่ในไดเรกทอรีย่อยคุณอาจต้องการระบุพา ธ แบบเต็มด้วยตนเองหรือใช้ไฟล์. gitignore เฉพาะไดเรกทอรี)
simont

40
ฉันทำงานนี้ไม่ได้ ฉันไม่สนใจโฟลเดอร์ (เช่นwp/) แต่ฉันไม่ต้องการเพิกเฉยต่อไฟล์บางไฟล์ในโฟลเดอร์นั้น (เช่นwp/path/to/some/location/*) วิธีเดียวที่ฉันจะทำให้งานทำงานได้ก็คือการทำgit add -f wp/path/to/some/location/*
trusktr

13
@trusktr ใช้!*/ข้อยกเว้นของ simont
Tobias Kienzler

7
Geez ที่กฎข้อสุดท้าย: !*/สร้างความแตกต่างทั้งหมดในความพยายามที่ไร้ประโยชน์ของฉันเพื่อบีบ.gitignoreไฟล์ให้ทำงาน ขอบคุณมาก.
racl101

628

หากคุณต้องการละเว้นเนื้อหาทั้งหมดของไดเรกทอรียกเว้นหนึ่งไฟล์ในนั้นคุณสามารถเขียนกฎสำหรับแต่ละไดเรกทอรีในเส้นทางของไฟล์ เช่น. gignignore เพื่อละเว้นโฟลเดอร์ pippo ยกเว้นจาก pippo / pluto / paperino.xml

.gitignore

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml

58
คำตอบที่ดีเยี่ยม แต่มันคุ้มค่าของการสังเกตสำหรับทุกคนที่มาในนี้ในภายหลังว่าfooและfoo/*มีไม่เหมือนกัน เพื่อให้สิ่งนี้ใช้งานได้คุณต้องใช้foo/*สำหรับโฟลเดอร์พื้นฐาน
thislooksfun

20
@ Mayank Pippo เป็นชาว Goofy ในอิตาลีในขณะที่ Paperino เป็น Donald Duck และ Pluto ก็เหมือนกับภาษาอังกฤษ พวกเขาเคยเป็น triplet ทั่วไปมากของชื่อตัวแปรสำหรับตัวอย่างการเขียนโปรแกรมย้อนกลับไปในวันที่ เป็นเรื่องดีที่ได้อ่านอีกครั้ง .. :)
Ghidello

สิ่งที่ @thislooksfun พูดมีความสำคัญหากคุณต้องการ "ยกเว้นโฟลเดอร์ยกเว้นไฟล์ x"
Czechnology

8
ไม่ทำงานสำหรับฉัน: node_modules / *! node_modules / bootstrap
SuperUberDuper

1
@simple_human นั่นจะเป็นจริงถ้าเขาเพิกเฉยทุกอย่างในที่เก็บรากหรือถ้าเขามีไฟล์. gitignore ดูแลอยู่ภายในไดเรกทอรีที่กล่าวถึง
xZero

244

คุณต้องการใช้/*แทน*หรือ*/ในกรณีส่วนใหญ่

การใช้*นั้นถูกต้อง แต่ใช้งานได้ซ้ำ มันจะไม่ดูในไดเรกทอรีจากนั้นออก ผู้คนแนะนำให้ใช้!*/กับรายการที่อนุญาตพิเศษอีกครั้ง แต่จริง ๆ แล้วมันดีกว่าที่จะขึ้นบัญชีดำในโฟลเดอร์ระดับสูงสุดด้วย/*

# Blacklist files/folders in same directory as the .gitignore file
/*

# Whitelist some files
!.gitignore
!README.md

# Ignore all files named .DS_Store or ending with .log
**/.DS_Store
**.log

# Whitelist folder/a/b1/ and folder/a/b2/
# trailing "/" is optional for folders, may match file though.
# "/" is NOT optional when followed by a *
!folder/
folder/*
!folder/a/
folder/a/*
!folder/a/b1/
!folder/a/b2/
!folder/a/file.txt

# Adding to the above, this also works...
!/folder/a/deeply
/folder/a/deeply/*
!/folder/a/deeply/nested
/folder/a/deeply/nested/*
!/folder/a/deeply/nested/subfolder

รหัสข้างต้นจะไม่สนใจไฟล์ทั้งหมดยกเว้น.gitignore, README.md, folder/a/file.txt, folder/a/b1/และfolder/a/b2/และทุกอย่างที่มีอยู่ในทั้งสองโฟลเดอร์ที่ผ่านมา (และ.DS_Storeและ*.logไฟล์จะถูกละเว้นในโฟลเดอร์เหล่านั้น)

เห็นได้ชัดว่าฉันสามารถทำเช่น!/folderหรือ!/.gitignoreเกินไป

ข้อมูลเพิ่มเติม: http://git-scm.com/docs/gitignore


3
ฉลาดมากขอบคุณ IMO นี่เป็นวิธีที่ดีที่สุดสำหรับเว็บไซต์ WordPress ที่มีกฎการรวมขั้นต่ำ นอกจากนี้ปลั๊กอินธีมหรืออัพเดต WP ใหม่ ๆ จะไม่ถูกลบหรือเพิ่มโดยไม่ได้รับอนุญาตจากคุณ เมื่อใช้ GitHub Desktop ฉันพบว่า.DS_Storeไฟล์จะไม่ถูกเพิกเฉย แต่ผ่านทางบรรทัดคำสั่งนี่ไม่ใช่ปัญหา เพื่อให้ได้รอบนี้ฉันต้องย้าย**/.DS_Storeกฎอื่น ๆ ด้านล่างทั้งหมด
Jibran

7
ปากกาเน้นข้อความภายในของฉันกำลังตอบโต้กับชื่อโพสต์ของคุณแปลก ๆ
itsadok

3
Gracias! นอกจากนี้คุณยังสามารถเพิ่มรายการที่ปลอดภัยในโฟลเดอร์ .. ! /some/folder/file.txt
PodTech.io

ยอดเยี่ยมการใช้ / * แทนที่จะเป็น * แก้ไขปัญหาทั้งหมดของฉันเมื่อคำตอบข้างต้นไม่ได้ คำถามเดียวของฉันตอนนี้คือความแตกต่างระหว่าง! / folder และ! / folder / *? ถ้าฉันใช้! / folder โดยไม่มี * มันยังคงรับการเปลี่ยนแปลงไฟล์ทั้งหมดในโฟลเดอร์เท่าที่ฉันสามารถบอกได้
dallin

1
@dallin ไม่มีความแตกต่าง รายการที่อนุญาตพิเศษหนึ่งโฟลเดอร์และอีกรายการที่อนุญาตพิเศษคือโฟลเดอร์ลูกของรายการนั้นซึ่งทำสิ่งเดียวกัน ปัญหาเดียวก็คือโฟลเดอร์หรือผู้ปกครองของไฟล์ที่จะต้องมีการอนุญาตพิเศษก่อนที่จะสามารถอนุญาตพิเศษเพื่อให้คุณไม่สามารถทำเช่น/*นั้น!/nested/folder/*(หรือเทียบเท่า!/nested/folder) โดยไม่ต้องทำ!/nested/หรือ!/nestedที่แรก! (และอาจ/nested/*อยู่ระหว่าง) เคล็ดลับที่ต้องจำคือถ้าคุณได้รับอนุญาตให้อยู่ในโฟลเดอร์ย่อยที่อยู่ในระดับลึกคุณต้องทำให้เด็ก ๆ ในแต่ละโฟลเดอร์ย่อยเป็นสีดำจนหมดและบัญชีดำเหล่านั้นจะจบลงด้วย "เฉือนดาว" ...
Ryan Taylor

75

เฉพาะเจาะจงมากขึ้น:

ตัวอย่าง: ดูรายละเอียดทุกอย่างในwebroot/cache- webroot/cache/.htaccessแต่ให้

สังเกตเห็นเครื่องหมายทับ (/) หลังcacheโฟลเดอร์:

ล้มเหลว

webroot/cache*
!webroot/cache/.htaccess

WORKS

webroot/cache/*
!webroot/cache/.htaccess

หากคุณใช้ VS Code โปรดระวังอย่าให้สีไฟล์ผิดหลังจากใช้สิ่งนี้กับโฟลเดอร์ที่มี. gitkeep เนื่องจากชื่อโฟลเดอร์จะเปลี่ยนเป็นสีเขียว แต่ไฟล์. gitkeep จะเปลี่ยนเป็นสีเทาเหมือนกับไฟล์ที่ถูกละเว้นอื่น ๆ . gitkeep จะดูเหมือนถูกเพิกเฉย แต่คุณควรเห็นว่ามี 'U' อยู่ทางด้านขวาซึ่งระบุว่าตรวจพบแล้ว
OzzyTheGiant


28

ในการเพิกเฉยบางไฟล์ในไดเรกทอรีคุณต้องทำตามลำดับที่ถูกต้อง :

ยกตัวอย่างเช่นไม่สนใจทุกอย่างในโฟลเดอร์ "โปรแกรม" ยกเว้น index.php และโฟลเดอร์ "การตั้งค่า" ให้ความสนใจกับการสั่งซื้อ

คุณต้องปฏิเสธความต้องการที่คุณต้องการก่อน

ล้มเหลว

application/*

!application/config/*

!application/index.php

WORKS

!application/config/*

!application/index.php

application/*


38
ไม่ถูกต้อง. คุณปฏิเสธหลังจาก "ละเว้นทุกสิ่ง"
คาร์ลอ

2
อย่าหลงกลgit statusเพื่อตรวจสอบว่าการเปลี่ยนแปลงของคุณ.gitignoreทำงานตามที่คาดไว้หรือไม่
Philippe Rathé

10
หากgit statusไม่บอกคุณว่ากำลังมองหาอะไรและไม่สนใจอะไรคุณจะรู้ได้อย่างไรว่าสิ่งนี้ใช้ได้ผล?
kris

1
@kris ล้างแคช git ก่อน ทำ "git rm --cached *" ก่อนจากนั้นคุณสามารถทำ "git เพิ่ม - ทั้งหมด" จากนั้น "สถานะ git" จะแสดงการเปลี่ยนแปลง gitignore ใหม่ทั้งหมดให้คุณ
Mark McCorkle

20

คุณสามารถใช้git config status.showUntrackedFiles noและไฟล์ที่ไม่ได้ติดตามจะถูกซ่อนไว้จากคุณ ดูman git-configรายละเอียดที่


นี่เป็นสิ่งที่ยอดเยี่ยมหากคุณต้องการส่งมอบไฟล์จำนวนมากจากหลาย ๆ ไฟล์!
Josh M.

16

หากต้องการแยกโฟลเดอร์ออกจาก. gitignore สามารถทำได้ดังต่อไปนี้

!app/

app/*
!app/bower_components/

app/bower_components/*
!app/bower_components/highcharts/

นี้จะไม่สนใจทุกไฟล์ / โฟลเดอร์ย่อยภายในยกเว้นbower_components/highcharts


14

มีคำถามที่คล้ายกันมากมายเกี่ยวกับเรื่องนี้ดังนั้นฉันจะโพสต์สิ่งที่ฉันเขียนไว้ก่อนหน้านี้:

วิธีเดียวที่ฉันได้รับสิ่งนี้เพื่อใช้กับเครื่องของฉันคือทำอย่างนี้:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
*.*

#Only Include these specific directories and subdirectories and files if you wish:
!wordpress/somefile.jpg
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*/*

สังเกตว่าคุณต้องอนุญาตเนื้อหาในแต่ละระดับที่คุณต้องการอย่างไร ดังนั้นถ้าฉันมีไดเรกทอรีย่อย 5 ลึกภายใต้ชุดรูปแบบฉันยังต้องสะกดออก

นี่คือจากความคิดเห็นของ @ Yarin ที่นี่: https://stackoverflow.com/a/5250314/1696153

หัวข้อเหล่านี้มีประโยชน์:

ฉันก็ลอง

*
*/*
**/**

และ **/wp-content/themes/**

หรือ /wp-content/themes/**/*

ไม่มีสิ่งใดที่เหมาะกับฉันเช่นกัน เส้นทางและข้อผิดพลาดมากมาย!


2
นี่เป็นวิธีการเดียวที่ทำงานเพื่อรวมเฉพาะส่วนขยายไฟล์บางอย่างเท่านั้น ยิ่งไปกว่านั้นมันยังสร้างงานศิลปะ ASCII ที่ยอดเยี่ยม: gist.github.com/Wolfgange3311999/91c671f5e4d3c56cf5a1
Matthew D. Scholefield

10

ฉันมีปัญหากับโฟลเดอร์ย่อย

ไม่ทำงาน, ไม่เป็นผล:

/custom/*
!/custom/config/foo.yml.dist

ผลงาน:

/custom/config/*
!/custom/config/foo.yml.dist

9

ฉันลองคำตอบทั้งหมดตามที่ระบุไว้ด้านบน แต่ไม่มีใครทำงานให้ฉันได้ หลังจากอ่านเอกสาร gitignore ( ที่นี่ ) ฉันพบว่าหากคุณแยกโฟลเดอร์ก่อนที่ชื่อไฟล์ในโฟลเดอร์ย่อยจะไม่ถูกทำดัชนี ดังนั้นหากคุณใช้เครื่องหมายอัศเจรีย์ในภายหลังเพื่อรวมไฟล์จะไม่พบในดัชนีและไม่รวมอยู่ในไคลเอนต์ git ของคุณ

นั่นคือวิธีในการค้นหาวิธีแก้ปัญหา ฉันเริ่มต้นด้วยการเพิ่มข้อยกเว้นสำหรับโฟลเดอร์ย่อยทั้งหมดในแผนผังโฟลเดอร์ของฉันเพื่อให้ทำงานได้ซึ่งเป็นงานที่แย่มาก หลังจากนั้นฉันก็สามารถกะทัดรัดรายละเอียดการกำหนดค่าไปที่การตั้งค่าด้านล่างซึ่งตรงกันข้ามกับเอกสารประกอบเล็กน้อย ..

การทำงาน. gignignore:

# Ignore the 'Pro' folder, except for the '3rdparty' subfolder 
/Pro/*
!Pro/3rdparty/

# Ignore the '3rdparty' folder, except for the 'domain' subfolder
/Pro/3rdparty/*
!Pro/3rdparty/domain/

# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/

เป็นผลให้ฉันเห็นในไคลเอนต์ git ของฉันว่ามีเพียงสองไฟล์ภายในโฟลเดอร์ Pro / 3rdparty / domain / modulename / กำลังถูก staged สำหรับการกระทำต่อไปและนั่นคือสิ่งที่ฉันกำลังมองหา

และถ้าคุณต้องการรายการที่อนุญาตพิเศษในโฟลเดอร์ย่อยหลาย ๆ โฟลเดอร์ในกลุ่มเดียวกันให้จัดกลุ่มบรรทัดเครื่องหมายอัศเจรีย์ด้านล่างของคำสั่งแยกเช่นนี้:

# Ignore the 'Pro' folder, except for the '3rdparty' subfolder 
/Pro/*
!Pro/3rdparty/

# Ignore the '3rdparty' folder, except for the 'domain' & 'hosting' subfolders
/Pro/3rdparty/*
!Pro/3rdparty/domain/
!Pro/3rdparty/hosting/

# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/

# Ignore the 'hosting' folder, except for the 'modulename' subfolder
Pro/3rdparty/hosting/*
!Pro/3rdparty/hosting/modulename/

มิฉะนั้นมันจะไม่ทำงานตามที่คาดไว้


ในที่สุดคำตอบที่ได้ผล ฉันสงสัยว่าเมื่อไหร่ฉันจะเข้าใจว่า. gignignore ใช้งานได้จริงอย่างไร
เดวิด

8

นั่นคือสิ่งที่ได้ผลสำหรับฉันฉันต้องการคอมมิชชัน Cordova เพียงหนึ่งเดียวกับ repo:

...
plugins/*
!plugins/cordova-plugin-app-customization

8

ฉันรู้ว่าฉันมางานปาร์ตี้สาย แต่นี่คือคำตอบของฉัน

ดังที่ @Joakim กล่าวว่าหากต้องการเพิกเฉยต่อไฟล์คุณสามารถใช้สิ่งต่อไปนี้

# Ignore everything
*

# But not these files...
!.gitignore
!someFile.txt

แต่ถ้าไฟล์อยู่ในไดเรกทอรีที่ซ้อนกันมันก็ยากที่จะเขียนกฎด้วยตนเอง

ตัวอย่างเช่นหากเราต้องการข้ามไฟล์ทั้งหมดในgitโครงการ แต่ไม่ได้a.txtอยู่ในaDir/anotherDir/someOtherDir/aDir/bDir/cDirไฟล์ จากนั้นเรา.gitignoreจะเป็นเช่นนี้

# Skip all files
*

# But not `aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt`
!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

.gitignoreไฟล์ที่ระบุข้างต้นจะข้าม dirs และไฟล์ทั้งหมดยกเว้น!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

ตามที่คุณอาจสังเกตเห็นมันยากที่จะกำหนดกฎเหล่านั้น

เพื่อแก้ไขสิ่งกีดขวางนี้ฉันได้สร้างแอปพลิเคชั่นคอนโซลชื่อgit-do-not-ละเว้นซึ่งจะสร้างกฎให้คุณ ฉันได้โฮสต์โครงการในgithubพร้อมคำแนะนำอย่างละเอียด

ตัวอย่างการใช้งาน

java -jar git-do-not-ignore.jar "aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt"

เอาท์พุต

!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

นอกจากนี้ยังมีเวอร์ชั่นเว็บอย่างง่ายที่นี่

ขอบคุณ.


7

ฉันมี Jquery และ Angular จาก bower Bower ติดตั้งพวกเขาใน

/public_html/bower_components/jquery/dist/bunch-of-jquery-files
/public_html/bower_components/jquery/src/bunch-of-jquery-source-files
/public_html/bower_components/angular/angular-files

jquery ที่ย่อเล็กสุดอยู่ในdistไดเรกทอรีและ angular อยู่ภายในangularไดเรกทอรี ฉันต้องการเพียงไฟล์ย่อเล็กสุดเท่านั้นที่จะได้รับการยอมรับกับ GitHub บางคนยุ่งกับ. gignignore และนี่คือสิ่งที่ฉันจัดการเพื่อคิดในใจ ...

/public_html/bower_components/jquery/*
!public_html/bower_components/jquery/dist
/public_html/bower_components/jquery/dist/*
!public_html/bower_components/jquery/dist/jquery.min.js
/public_html/bower_components/angular/*
!public_html/bower_components/angular/angular.min.js

หวังว่าบางคนจะพบว่ามีประโยชน์นี้


7

นี่คือวิธีที่ฉันทำ:

# Ignore everything
*

# Whitelist anything that's a directory
!*/

# Whitelist some files
!.gitignore

# Whitelist this folder and everything inside of it
!wordpress/wp-content/themes/my-theme/**

# Ignore this folder inside that folder
wordpress/wp-content/themes/my-theme/node_modules

# Ignore this file recursively
**/.DS_Store

ใช้gig status -uเพื่อดูไฟล์แต่ละไฟล์ในไดเรกทอรีที่ไม่ได้ติดตามซึ่งวนซ้ำโดยgit statusคุณจะเห็นเฉพาะโฟลเดอร์ซึ่งอาจหลอกคุณให้คิดว่าทุกอย่างภายในนั้นถูกติดตาม


5

วิธีแก้ปัญหาง่ายๆหากคุณต้องการละเว้นทุกสิ่งยกเว้นไฟล์บางไฟล์และโฟลเดอร์รูทบางโฟลเดอร์

/*
!.gitignore
!showMe.txt
!my_visible_dir

เวทมนตร์อยู่ใน/*(ตามที่อธิบายไว้ข้างต้น) มันจะไม่สนใจทุกสิ่งในโฟลเดอร์ (ราก) แต่ไม่ซ้ำไปซ้ำมา


4

ฉันยังมีปัญหาบางอย่างกับการปฏิเสธของไฟล์เดียว ฉันสามารถส่งมอบได้ แต่ IDE (IntelliJ) ของฉันมักจะบ่นเกี่ยวกับไฟล์ที่ถูกละเว้นซึ่งถูกติดตามอยู่เสมอ

git ls-files -i --exclude-from .gitignore

แสดงไฟล์ทั้งสองซึ่งฉันได้ยกเว้นด้วยวิธีนี้:

public/
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

ในท้ายที่สุดสิ่งนี้ได้ผลกับฉัน:

public/*
!public/typo3conf/
public/typo3conf/*
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

กุญแจสำคัญคือการปฏิเสธของโฟลเดอร์ typo3conf/ก่อน

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

โฟลเดอร์!public/typo3conf/และเนื้อหาของโฟลเดอร์public/typo3conf/*เป็นสองสิ่งที่แตกต่างกันสำหรับ. gignignore

เยี่ยมมาก! ปัญหานี้รบกวนฉันสักพัก;)


3

ไม่มีอะไรที่เหมาะกับฉันเพราะฉันพยายามเพิ่มหนึ่งขวดจาก lib

สิ่งนี้ไม่ทำงาน:

build/*
!build/libs/*
!build/libs/
!build/libs/myjarfile.jar 

สิ่งนี้ได้ผล:

build/*
!build/libs


2

มีปัญหาที่คล้ายกันเป็น OP แต่ไม่มีของ 10 อันดับคำตอบ upvoted ทำงานจริง
ในที่สุดฉันก็พบสิ่งต่อไปนี้

ไวยากรณ์ผิด:

*
!bin/script.sh

ไวยากรณ์ที่ถูกต้อง:

*
!bin
!bin/script.sh

คำอธิบายจากgitignore man page :

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

ตัวอย่างเพิ่มเติม:

ต้นไม้ $

.
├── .gitignore
└── bin
    ├── ignore.txt
    └── sub
        └── folder
            └── path
                ├── other.sh
                └── script.sh

$ cat .gignignore

*
!.gitignore
!bin
!bin/sub
!bin/sub/folder
!bin/sub/folder/path
!bin/sub/folder/path/script.sh

$ git status - ถูกติดตามไฟล์ - กำหนด

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore
        bin/sub/folder/path/script.sh

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)
        bin/ignore.txt
        bin/sub/folder/path/other.sh

nothing added to commit but untracked files present (use "git add" to track)

1

ส่วนสำคัญ

# Ignore everything
*

# But not these files...
!script.pl
!template.latex

และอาจรวมถึง:

!.gitignore

การอ้างอิง

จากhttps://git-scm.com/docs/gitignore :

คำนำหน้าเพิ่มเติมซึ่งเป็นตัวเลือก " !" ซึ่งจะลบล้างรูปแบบ ไฟล์ที่ตรงกันใด ๆ ที่ยกเว้นโดยรูปแบบก่อนหน้านี้จะถูกรวมอีกครั้ง เป็นไปไม่ได้ที่จะรวมไฟล์อีกครั้งหากไม่รวมไดเรกทอรีหลักของไฟล์นั้น Git ไม่แสดงไดเรกทอรีที่แยกออกด้วยเหตุผลด้านประสิทธิภาพดังนั้นรูปแบบใด ๆ ของไฟล์ที่มีอยู่จะไม่มีผลกระทบไม่ว่าจะถูกกำหนดไว้ที่ใด วางแบ็กสแลช (" \") ไว้ด้านหน้า "" อันแรก!สำหรับรูปแบบที่ขึ้นต้นด้วยตัวอักษร " !" เช่น " \!important!.txt"

...

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

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

0

ฉันดูเหมือนจะพบสิ่งที่เหมาะกับฉันซึ่งไม่มีใครพูดถึง

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# And if you want to include a sub-directory and all sub-directory and files under it, but not all sub-directories
!subdir/
!subdir/**/*

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

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