[英]gitignore all files except the .json files in all subdirectories of a particular directory
[英]gitignore all files of extension in directory
有沒有辦法忽略目錄中某個類型的所有文件?
**
顯然對 git 毫無意義,所以這不起作用:
/public/static/**/*.js
這個想法是匹配任意嵌套文件夾。
根據文檔,從1.8.2.1
版本開始, git
似乎支持**
語法。
與完整路徑名匹配的模式中的兩個連續星號(“
**
”)可能具有特殊含義:
前導“
**
”后跟斜杠表示在所有目錄中都匹配。 例如,“**/foo
”在任何地方匹配文件或目錄“foo
”,與模式“foo
”相同。 “**/foo/bar
” 匹配文件或目錄“bar
” 直接在目錄“foo
”下的任何地方。尾隨的“
/**
”匹配里面的所有內容。 例如,“abc/**
”匹配目錄“abc
”中的所有文件,相對於.gitignore
文件的位置,具有無限深度。斜杠后跟兩個連續的星號,然后斜杠匹配零個或多個目錄。 例如,“
a/**/b
”匹配“a/b
”、“a/x/b
”、“a/x/y/b
”等。其他連續的星號被認為是無效的。
從未嘗試過,但git help ignore
建議如果你在/public/static
中放置一個帶有*.js
的.gitignore
,它會做你想做的事。
注意:請務必在下面查看 Joeys 的回答:如果您想忽略特定子目錄中的文件,那么本地 .gitignore 是正確的解決方案(本地性很好)。 但是,如果您需要將相同的模式應用於整個 repo,那么 ** 解決方案會更好。
更新:看看@Joey 的回答:Git 現在支持模式中的**
語法。 兩種方法都應該可以正常工作。
從與路徑相同的目錄或任何父目錄中的 .gitignore 文件讀取的模式,較高級別文件(直到工作樹的頂層)中的模式被低級別文件中的模式覆蓋到目錄包含文件。
這意味着在您的 repo 的任何給定目錄中的.gitignore
文件中的模式都會影響該目錄和所有子目錄。
您提供的模式
/public/static/**/*.js
不太正確,首先是因為(正如您正確指出的)Git 不使用**
語法。 此外,前導/
將該模式錨定到路徑名的開頭。 (因此, /public/static/*.js
將匹配/public/static/foo.js
但不匹配/public/static/foo/bar.js
。)
刪除前導
編輯:僅僅刪除前導斜杠也不起作用——因為該模式仍然包含一個斜杠,它被 Git 視為一個普通的、非遞歸的 shell glob(感謝@Joey Hoer指出這一點)。/
也不起作用,匹配諸如
public/static/foo.js
之類的路徑
public/static/foo.js
和
foo/public/static/bar.js
。
正如@ptyx 建議的那樣,您需要做的是創建文件<repo>/public/static/.gitignore
並僅包含以下模式:
*.js
沒有前導/
,因此它將匹配路徑的任何部分,並且該模式只會應用於/public/static
目錄及其子目錄中的文件。
我嘗試在我的 vscode windows 10
中打開.gitignore
文件。 在那里你可以看到,一些以前添加的忽略文件(如果有的話)。
要創建一個新規則以忽略具有(.js)
擴展名的文件,請附加文件的擴展名,如下所示:
*.js
這將忽略git
存儲庫中的所有.js
文件。
要從特定目錄中排除某些類型的文件,您可以添加以下內容:
**/foo/*.js
這將忽略僅 /foo/ 目錄中的所有 .js 文件。
詳細學習可以訪問: about git-ignore
要忽略未跟蹤的文件,只需轉到 .git/info/exclude。 排除是具有忽略擴展名或文件列表的文件。
我相信最簡單的解決方案是使用find
。 我不喜歡在子目錄中有多個.gitignore
,我更喜歡管理一個獨特的頂級.gitignore
。 為此,您只需將找到的文件附加到您的.gitignore
。 假設/public/static/
是你的項目/git home 我會使用類似的東西:
find . -type f -name *.js | cut -c 3- >> .gitignore
我發現在開始時刪除./
通常是 git 了解要避免哪些文件所必需的。 因此cut -c 3-
。
除了其他答案之外,幾乎沒有其他提示(如果您很幸運並且問題是由於其他原因引起的,這可能會起作用):
正如其他答案已經說過的那樣,像**/*.exe
這樣的模式將忽略存儲庫中任何位置的所有.exe
文件。
但是,很多人(像我一樣)在故障排除時肯定會遇到這個問題......
為什么這不起作用。
因此,命令git status
或您的 IDE 可能會告訴您xyz.exe
即將提交,並且您可能正在拼命想弄清楚為什么會這樣,因為您確實有**/*.exe
在您的 .gitignore 文件中,並且由於此問答確認這實際上是正確的魔法咒語,應該可以防止這種情況發生。 但事實並非如此。
您處於這種荒謬情況的實際原因是您(或者,更有可能是您的 IDE 自動為您准備)已經暫存了該文件。
解決方案是先取消暫存它,然后將其忽略。
<rant>
“暫存區”是 git 的一個完全沒用的功能,它是一個主要的痛苦來源,沒有任何值得一提的好處; 但是,它是 git 工作方式的核心,因此您必須始終注意它。 現在,您的 IDE 可能試圖讓您不必擔心暫存,(因為它應該如此)但沒有什么是完美的,所以不可避免地,每隔一段時間就會有痛苦。 </rant>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.