[英]Git - How to ignore all files inside one directory recursively but some files with an specific extension
[英]Recursively ignore all files inside a specific directory except .json files
我的文件結構類似於以下文件結構:
foo/bar.foo
node_modules/foo/bar.json
node_modules/foo/bar/foo.bar
我想做的是忽略node_modules
文件夾內除json
文件之外的所有文件,以便在存儲庫中得到以下文件結構:
foo/bar.foo
node_modules/foo/bar.json
我試圖找到一種簡單的方法來做到這一點,但我還沒有到那兒。
這是我在.gitignore
:
# ignore everything inside node_modules
node_modules/*
# But descend into directories
!node_modules/**/*.json
達到預期效果的最優雅方法是什么?
PS我不知道我在做什么。
在gitignore文檔中,它們指出:
如果排除該文件的父目錄,則無法重新包含該文件。
這為您的規則失敗的原因提供了直覺。 您可以使用一些xargs魔術來手動添加缺少的json文件。 每當添加新程序包時,您都必須運行此程序,但是一旦跟蹤它們,一切都會正常進行。
find node_modules/* -name *.json -print |xargs git add -f
我使用Git 2.18.0
進行了測試,並確認以這種方式添加后,被忽略目錄中的文件可以正常工作。 對於您的.gitignore
規則所排除的更深層路徑,上面的-f
參數是必需的。
您必須首先不要忽略(排除)被忽略目錄的子文件夾。
# ignore everything inside node_modules
node_modules/**
# exclude or whitelist subfolders: note the trailing /
!node_modules/**/
# But descend into directories
!node_modules/**/*.json
請使用git check-ignore -v -- afile
來檢查哪個規則仍然會忽略您的文件。
並確保這些文件未添加到索引中( git rm --cached -r node_modules
)
好的,所以我終於找到了解決方案。 訣竅如下:
# Ignore all the files inside the node_modules folder
node_modules/**/*.*
# Allow only json files inside the node_modules folder
!node_modules/**/*.json
問題是通過執行node_modules/*
,它不僅會忽略文件,還會忽略文件夾。
正如git doc所說:
如果排除該文件的父目錄,則無法重新包含該文件。
因此,相反,我做了node_modules/**/*.*
,它僅排除文件而不包括文件夾。
這樣, !node_modules/**/*.json
實際上就能將json
文件列入白名單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.