ฉันมีโฟลเดอร์ซึ่งผมเพิ่มapplication/
.gitignore
ภายใน โฟลเดอร์เป็นโฟลเดอร์application/
application/language/gr
ฉันจะรวมโฟลเดอร์นี้ได้อย่างไร
ฉันได้ลองแล้ว
application/
!application/language/gr/
โดยไม่มีโชค ...
ฉันมีโฟลเดอร์ซึ่งผมเพิ่มapplication/
.gitignore
ภายใน โฟลเดอร์เป็นโฟลเดอร์application/
application/language/gr
ฉันจะรวมโฟลเดอร์นี้ได้อย่างไร
ฉันได้ลองแล้ว
application/
!application/language/gr/
โดยไม่มีโชค ...
คำตอบ:
หากคุณยกเว้นapplication/
แล้วทุกอย่างที่อยู่ภายใต้จะถูกยกเว้นเสมอ (แม้ว่าบางรูปแบบการยกเว้นเชิงลบในภายหลัง (“ unignore”) อาจตรงกับบางสิ่งภายใต้application/
)
ในการทำสิ่งที่คุณต้องการคุณต้อง "ยกเลิกการลงทะเบียน" ทุกไดเรกทอรีหลักของสิ่งใดก็ตามที่คุณต้องการ "ยกเลิกการลงทะเบียน" โดยทั่วไปแล้วคุณจะเขียนกฎสำหรับสถานการณ์นี้เป็นคู่: ละเว้นทุกสิ่งในไดเรกทอรี แต่ไม่ใช่ไดเรกทอรีย่อยบางอย่าง
# you can skip this first one if it is not already excluded by prior patterns
!application/
application/*
!application/language/
application/language/*
!application/language/gr/
หมายเหตุ
การติดตาม/*
มีความสำคัญ:
dir/
ไม่รวมไดเรกทอรีที่มีชื่อdir
และทุกอย่างที่อยู่ภายใต้ (โดยปริยาย) dir/
, Git จะไม่มองไปที่อะไรภายใต้dir
และจึงจะไม่ใช้ใด ๆ ของ“ยกเลิกการยกเว้น” dir
รูปแบบเพื่ออะไรภายใต้dir/*
ไม่ได้พูดอะไรเกี่ยวกับdir
ตัวเอง; dir
มันเป็นเพียงแค่ไม่รวมทุกอย่างภายใต้ ด้วยdir/*
Git จะประมวลผลเนื้อหาโดยตรงของdir
ให้รูปแบบอื่น ๆ มีโอกาส "ยกเลิกการยกเว้น" เนื้อหาบางส่วน ( !dir/sub/
)/*
มีความสำคัญ หากไม่รวมไดเรกทอรี Git จะไม่ดูเนื้อหาของไดเรกทอรีนั้น รูปแบบdir/
ไม่รวมไดเรกทอรีที่มีชื่อdir
และทุกอย่างที่อยู่ภายใต้ (โดยปริยาย) รูปแบบที่dir/*
ไม่ได้พูดอะไรเกี่ยวกับdir
ตัวเอง; dir
มันเป็นเพียงแค่ไม่รวมทุกอย่างภายใต้ ด้วยdir/
, Git จะไม่มองไปที่อะไรภายใต้dir
และจึงจะไม่ใช้ใด ๆ ของ“ยกเลิกการยกเว้น” dir
รูปแบบเพื่ออะไรภายใต้ ด้วยdir/*
Git จะประมวลผลเนื้อหาโดยตรงของdir
ให้รูปแบบอื่น ๆ มีโอกาส "ยกเลิกการยกเว้น" เนื้อหาบางส่วน ( !dir/sub/
)
git add -f .
git status
ซึ่งจะบอกคุณว่าไดเรกทอรีระดับบนสุดจะถูกเพิ่ม ให้ทำgit add
ไดเร็กตอรี่ระดับบนสุดแทนจากนั้นgit status
จะแสดงรายการชุดย่อยของไฟล์ที่ตรงกับรูปแบบ
Commit 59856deจากKarsten Blees (kblees)สำหรับ Git 1.9 / 2.0 (Q1 2014) ชี้แจงกรณีดังกล่าว:
gitignore.txt
: ชี้แจงลักษณะการเรียกซ้ำของไดเรกทอรีที่ไม่รวมคำนำหน้าเพิ่มเติมซึ่งเป็นตัวเลือก "
!
" ซึ่งจะลบล้างรูปแบบ ไฟล์ที่ตรงกันใด ๆ ที่ยกเว้นโดยรูปแบบก่อนหน้านี้จะถูกรวมอีกครั้งเป็นไปไม่ได้ที่จะรวมไฟล์อีกครั้งหากไม่รวมไดเรกทอรีหลักของไฟล์นั้น (
*
)
(*
: เว้นแต่จะมีเงื่อนไขตามที่ระบุใน git 2.8+, ดูด้านล่าง)
Git ไม่แสดงไดเรกทอรีที่ไม่รวมด้วยเหตุผลด้านประสิทธิภาพดังนั้นรูปแบบใด ๆ ของไฟล์ที่มีอยู่จะไม่มีผลใด ๆ ไม่ว่าจะถูกกำหนดไว้ที่ใดวางแบ็กสแลช ("
\
") ไว้ด้านหน้า "" อันแรก!
สำหรับรูปแบบที่ขึ้นต้นด้วยตัวอักษร "!
" เช่น "\!important!.txt
"ตัวอย่างการยกเว้นทุกอย่างยกเว้นไดเรกทอรีที่เฉพาะเจาะจง
foo/bar
(โปรดทราบ/*
- โดยไม่ต้องเครื่องหมายทับ, สัญลักษณ์แทนจะยกเว้นทุกอย่างภายในfoo/bar
):
--------------------------------------------------------------
$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar
--------------------------------------------------------------
ในกรณีของคุณ:
application/*
!application/**/
application/language/*
!application/language/**/
!application/language/gr/**
คุณต้องโฟลเดอร์ White-List ก่อนจึงจะสามารถ White-List ไฟล์ภายในโฟลเดอร์ที่กำหนด
อัปเดตเดือนกุมภาพันธ์ / มีนาคม 2559:
โปรดทราบว่าด้วย git 2.9.x / 2.10 (กลางปี 2016?) อาจเป็นไปได้ที่จะรวมไฟล์อีกครั้งหากไดเรกทอรีหลักของไฟล์นั้นถูกแยกออกหากไม่มีสัญลักษณ์ตัวแทนในเส้นทางที่รวมอยู่ด้วย
NguyễnTháiNgọc Duy ( pclouds
)กำลังพยายามเพิ่มคุณสมบัตินี้:
ดังนั้นด้วย git 2.9+ สิ่งนี้สามารถใช้งานได้จริง แต่ถูกเปลี่ยนกลับในที่สุด:
application/
!application/language/gr/
v2.8.1.windows.1
แต่ดูเหมือนว่ามันจะไม่ทำงาน :(
application/
+ ที่!application/language/gr/
กล่าวถึงในคำตอบนั้นทำงานได้ตามที่คาดไว้
@Chris Johnsen คำตอบนั้นยอดเยี่ยม แต่ด้วย Git รุ่นใหม่กว่า (1.8.2 หรือใหม่กว่า) มีรูปแบบเครื่องหมายดอกจันคู่ที่คุณสามารถใช้ประโยชน์จากโซลูชันชวเลขได้มากกว่า:
# assuming the root folder you want to ignore is 'application'
application/**/*
# the subfolder(s) you want to track:
!application/language/gr/
ด้วยวิธีนี้คุณไม่จำเป็นต้อง "ยกเลิกการลงทะเบียน" ไดเรกทอรีหลักของโฟลเดอร์ย่อยที่คุณต้องการติดตาม
ด้วย Git 2.17.0 (ไม่แน่ใจว่าเร็วแค่ไหนก่อนรุ่นนี้อาจเป็น 1.8.2) โดยใช้**
รูปแบบที่รวมกับการแยกสำหรับแต่ละไดเรกทอรีย่อยที่นำไปสู่ไฟล์ของคุณ ตัวอย่างเช่น:
# assuming the root folder you want to ignore is 'application'
application/**
# Explicitly track certain content nested in the 'application' folder:
!application/language/
!application/language/gr/
!application/language/gr/** # Example adding all files & folder in the 'gr' folder
!application/language/gr/SomeFile.txt # Example adding specific file in the 'gr' folder
**
สามารถจับคู่กับโฟลเดอร์ย่อยได้และ*
จะจับคู่language
และแยกออกเพื่อป้องกันการรวมเข้าgr
ด้วยกัน ห่วงโซ่เต็มรูปแบบของผู้ปกครอง @Chris Johnson แนะนำดูเหมือนยังจำเป็น
/www/**/* !/www/config.xml !/www/res
config.xml และไดเรกทอรี res ยังคงถูกละเว้น
!/www/res/
ด้วย คุณสามารถใช้folder/**/*
รูปแบบได้ แต่คุณยังต้องเพิ่มการยกเว้นสำหรับแต่ละไดเรกทอรีย่อยที่คุณต้องการเพิ่ม มันยังสั้นกว่าและอ่านได้ง่ายกว่าคำสั่งผสมละเว้น / ไม่รวม
มีคำถามที่คล้ายกันมากมายเกี่ยวกับเรื่องนี้ดังนั้นฉันจะโพสต์สิ่งที่ฉันเขียนไว้ก่อนหน้านี้:
วิธีเดียวที่ฉันได้รับสิ่งนี้เพื่อใช้กับเครื่องของฉันคือทำอย่างนี้:
# 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:
!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/**/*
ไม่มีสิ่งใดที่เหมาะกับฉันเช่นกัน ลองผิดลองถูกมากมาย!
!
กฎไว้ที่ด้านล่าง
ฉันพบว่าใช้งานได้จริงเท่านั้น
**/node_modules/*
!**/node_modules/keep-dir
วิธีที่ง่ายและน่าจะดีที่สุดคือลองเพิ่มไฟล์ด้วยตนเอง (โดยทั่วไปจะมีความสำคัญมากกว่า.gitignore
กฎสไตล์):
git add /path/to/module
คุณอาจต้องการให้มี-N
ความตั้งใจที่จะเพิ่มการตั้งค่าสถานะเพื่อแนะนำคุณจะเพิ่มพวกเขา แต่ไม่ได้ทันที ฉันมักจะทำสิ่งนี้สำหรับไฟล์ใหม่ฉันยังไม่พร้อมที่จะแสดง
นี้สำเนาของคำตอบโพสต์เกี่ยวกับสิ่งที่ได้อย่างง่ายดายอาจจะเป็น QA ซ้ำกัน ฉันประกาศใหม่ที่นี่เพื่อเพิ่มทัศนวิสัย - ฉันคิดว่าง่ายกว่าที่จะไม่ยุ่งกับกฎของ gitignore
ดังนั้นเนื่องจากโปรแกรมเมอร์หลายคนใช้โหนด กรณีการใช้งานที่ตรงกับคำถามนี้คือยกเว้นnode_modules
ยกเว้นหนึ่งโมดูลmodule-a
ตัวอย่าง:
!node_modules/
node_modules/*
!node_modules/module-a/
2.10.2.windows.1
ไม่ทำงานสำหรับรุ่นคอมไพล์
เพิ่มคำตอบเพิ่มเติม:
!/.vs/ <== include this folder to source control, folder only, nothing else
/.vs/* <== but ignore all files and sub-folder inside this folder
!/.vs/ProjectSettings.json <== but include this file to source control
!/.vs/config/ <== then include this folder to source control, folder only, nothing else
!/.vs/config/* <== then include all files inside the folder
นี่คือผลลัพธ์:
โดยเฉพาะอย่างยิ่งสำหรับ Git เวอร์ชันเก่าคำแนะนำส่วนใหญ่จะใช้งานไม่ได้ หากเป็นกรณีนี้ฉันจะใส่. gignignore แยกต่างหากในไดเรกทอรีที่ฉันต้องการให้เนื้อหาถูกรวมโดยไม่คำนึงถึงการตั้งค่าอื่น ๆ และอนุญาตสิ่งที่จำเป็น
ตัวอย่างเช่น: /.gitignore
# ignore all .dll files
*.dll
/dependency_files/.gitignore
# include everything
!*
ดังนั้นทุกอย่างใน / dependency_files (รวมถึงไฟล์. dll) ก็รวมอยู่ด้วย
ฉันได้พบกรณีที่คล้ายกันที่นี่ซึ่งใน laravel โดยค่าเริ่มต้น.gitignore
ละเว้นทั้งหมดโดยใช้ asterix จากนั้นแทนที่ไดเรกทอรีสาธารณะ
*
!public
!.gitignore
สิ่งนี้ไม่เพียงพอหากคุณพบกับสถานการณ์จำลอง
หากคุณต้องการที่จะกระทำเฉพาะโฟลเดอร์ย่อยของpublic
กล่าวว่าสำหรับเช่นของคุณในpublic/products
ไดเรกทอรีที่คุณต้องการรวมไฟล์ที่เป็นหนึ่งในโฟลเดอร์ย่อยเช่นลึกที่จะรวมpublic/products/a/b.jpg
พวกเขาเคยถูกตรวจพบอย่างถูกต้องแม้ว่าคุณจะเพิ่มพวกเขาโดยเฉพาะเช่นนี้!/public/products
, !public/products/*
ฯลฯ ..
ทางออกคือเพื่อให้แน่ใจว่าคุณเพิ่มรายการสำหรับทุกระดับเส้นทางเช่นนี้เพื่อแทนที่พวกเขาทั้งหมด
*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*
อีกตัวอย่างหนึ่งของการเดินโครงสร้างไดเรกทอรีเพื่อให้ได้สิ่งที่คุณต้องการ หมายเหตุ: ฉันไม่ได้ยกเว้นLibrary/
แต่Library/**/*
# .gitignore file
Library/**/*
!Library/Application Support/
!Library/Application Support/Sublime Text 3/
!Library/Application Support/Sublime Text 3/Packages/
!Library/Application Support/Sublime Text 3/Packages/User/
!Library/Application Support/Sublime Text 3/Packages/User/*macro
!Library/Application Support/Sublime Text 3/Packages/User/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/*settings
!Library/Application Support/Sublime Text 3/Packages/User/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/*theme
!Library/Application Support/Sublime Text 3/Packages/User/**/
!Library/Application Support/Sublime Text 3/Packages/User/**/*macro
!Library/Application Support/Sublime Text 3/Packages/User/**/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/**/*settings
!Library/Application Support/Sublime Text 3/Packages/User/**/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/**/*theme
> git add Library
> git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: Library/Application Support/Sublime Text 3/Packages/User/Default (OSX).sublime-keymap
new file: Library/Application Support/Sublime Text 3/Packages/User/ElixirSublime.sublime-settings
new file: Library/Application Support/Sublime Text 3/Packages/User/Package Control.sublime-settings
new file: Library/Application Support/Sublime Text 3/Packages/User/Preferences.sublime-settings
new file: Library/Application Support/Sublime Text 3/Packages/User/RESTer.sublime-settings
new file: Library/Application Support/Sublime Text 3/Packages/User/SublimeLinter/Monokai (SL).tmTheme
new file: Library/Application Support/Sublime Text 3/Packages/User/TextPastryHistory.sublime-settings
new file: Library/Application Support/Sublime Text 3/Packages/User/ZenTabs.sublime-settings
new file: Library/Application Support/Sublime Text 3/Packages/User/adrian-comment.sublime-macro
new file: Library/Application Support/Sublime Text 3/Packages/User/json-pretty-generate.sublime-snippet
new file: Library/Application Support/Sublime Text 3/Packages/User/raise-exception.sublime-snippet
new file: Library/Application Support/Sublime Text 3/Packages/User/trailing_spaces.sublime-settings
ใน WordPress สิ่งนี้ช่วยฉัน:
wp-admin/
wp-includes/
/wp-content/*
!wp-content/plugins/
/wp-content/plugins/*
!/wp-content/plugins/plugin-name/
!/wp-content/plugins/plugin-name/*.*
!/wp-content/plugins/plugin-name/**
gitignore - ระบุไฟล์ที่ไม่ได้ติดตามอย่างตั้งใจที่จะเพิกเฉย
ตัวอย่างการยกเว้นทุกอย่างยกเว้นไดเรกทอรีที่ระบุfoo / bar (หมายเหตุ/ * - โดยไม่มีเครื่องหมายทับ, สัญลักษณ์ตัวแทนจะยกเว้นทุกอย่างภายในfoo / bar ):
$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar
อีกตัวอย่างสำหรับWordPress :
!/wp-content
wp-content/*
!/wp-content/plugins
wp-content/plugins/*
!wp-content/plugins/my-awesome-plugin
ข้อมูลเพิ่มเติมได้ที่นี่: https://git-scm.com/docs/gitignore
ฉันมักจะใช้วิธีแก้ปัญหานี้ใน CLI ที่แทนของการกำหนดค่าของฉัน.gitignore
, ฉันจะสร้างแยก.include
ไฟล์ที่ผมกำหนด (ย่อย) .gitignore
ไดเรกทอรีฉันต้องการรวมทั้งๆที่ไดเรกทอรีโดยตรงหรือซ้ำโดยไม่สนใจ
ดังนั้นฉันยังใช้
git add `cat .include`
ในระหว่างการแสดงละครก่อนที่จะกระทำ
สำหรับ OP ฉันแนะนำให้ใช้ a .include
ซึ่งมีเส้นต่อไปนี้:
<parent_folder_path>/application/language/gr/*
หมายเหตุ: การใช้cat
ไม่อนุญาตให้มีการใช้ชื่อแทน (ภายใน.include
) เพื่อระบุ $ HOME (หรือไดเรกทอรีเฉพาะอื่น ๆ ) เพราะนี่คือสายhomedir/app1/*
เมื่อผ่านไปgit add
ได้โดยใช้คำสั่งดังกล่าวจะปรากฏเป็นgit add 'homedir/app1/*'
และล้อมรอบตัวอักษรในราคาเดียว ( '') เก็บรักษามูลค่าที่แท้จริงของตัวละครแต่ละตัวที่อยู่ในคำพูดจึงป้องกันนามแฝง (เช่นhomedir ) จากการทำงาน (ดูทุบตีเดี่ยว คำคม )
นี่คือตัวอย่างของหนึ่ง.include
ไฟล์ผมใช้ใน repo ของฉันที่นี่
/home/abhirup/token.txt
/home/abhirup/.include
/home/abhirup/.vim/*
/home/abhirup/.viminfo
/home/abhirup/.bashrc
/home/abhirup/.vimrc
/home/abhirup/.condarc
ฉันต้องการติดตามไฟล์ jquery production js และสิ่งนี้ใช้ได้:
node_modules/*
!node_modules/jquery
node_modules/jquery/*
!node_modules/jquery/dist/*
JetBrains IntelliJ IDEA .gitore ของฉันการกำหนดค่าที่ฉันต้องแยก.idea
โฟลเดอร์wholde ยกเว้น.idea/runConfigurations
:
.idea
!.idea/
.idea/*
!.idea/runConfigurations/
โปรดดู: https://github.com/daggerok/gitignore-idea-runConfigurations
.gitignore
รูปแบบลวดลาย" จะชัดเจนขึ้น (ธันวาคม 2556) ดูคำตอบของฉันด้านล่าง