[英]gitignore: Ignore all files in folder hierarchy except one specific filetype
我想忽略文件夾中下方和文件夾中的所有文件,但可能位於文件夾層次結構中的特定文件類型除外:
例
/Test
/Test/unknown/folder/structure/below
現在,我想忽略Test
文件夾中及其下方的所有文件,除了某些名為layout.css
CSS文件之外,例如:
/Test/layout.css
/Test/fileto.ignore
/Test/another/folder/ig.nore
/Test/in/a/unknown/folder/layout.css
/Test/in/a/unknown/folder/ignore.me
.gitignore應該忽略
/Test/fileto.ignore
/Test/another/folder/ig.nore
/Test/in/a/unknown/folder/ignore.me
我的.gitignore文件不起作用:
Test/
!layout.css
有什么建議么?
通過將.gitignore
文件放在Test/
目錄中,可以得到您的示例,其中包含以下內容。
*
!*/
!.gitignore
!layout.css
為了完成您想要的工作,您需要使用一些否定排除項。
基本思想是您需要排除要忽略的任何文件的每個父目錄。
因此,如果您希望將/Test/in/a/unknown/folder/layout.css添加到git倉庫中,則必須忽略/ Test /,/ Test / in /,/ Test / in / a /,/ Test / in / a / unknown /和/ Test / in / a / unknown / folder /。
然后,當您最終進入包含一些被忽略文件和一些未被忽略文件的目錄時,需要分別指定每個文件,如下所示:
# Fille: .gitignore
!Test/
Test/*
!Test/layout.css
Test/fileto.ignore
!Test/another/
Test/another/*
!Test/another/folder/
Test/another/folder/*
!Test/in/
Test/in/*
!Test/in/a/
Test/in/a/*
!Test/in/a/unknown/
Test/in/a/unknown/*
!Test/in/a/unknown/folder/
Test/in/a/unknown/folder/ignore.me
!Test/in/a/unknown/folder/layout.css
因此,當您運行$ git add-all
您將看到所需的結果:
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: .gitignore
new file: Test/in/a/unknown/folder/layout.css
new file: Test/layout.css
注意:您可以在http://lexsheehan.blogspot.com/2014/05/git-add-update.html上找到有關為什么git add-all
是將文件添加到git repo的最佳方法的解釋。
這是一個非常古老的問題,但是由於我一直在努力解決這個問題,即使現在我仍想與我分享解決該問題的實際方法。
問題是,您無法像在忽略Git中一樣提交空目錄時,此規則不適用於.gitignore
。
來自https://git-scm.com/docs/gitignore
尾部的“ / **”匹配里面的所有內容 。 例如,相對於.gitignore文件的位置,“ abc / **”匹配目錄“ abc”內的所有文件的深度是無限的。
斜杠后跟兩個連續的星號,然后斜杠匹配零個或多個目錄。 例如,“ a / ** / b”匹配“ a / b”,“ a / x / b”,“ a / x / y / b”等。
**匹配內部所有內容-幾乎所有內容-文件和目錄。
這將我們引到gitignore docs中的另一點:
可選的前綴“!” 否定了模式; 先前模式排除的所有匹配文件將再次包含在內。 如果排除該文件的父目錄,則無法重新包含該文件。 由於性能原因,Git不會列出被排除的目錄,因此包含在文件上的任何模式無論在何處定義都無效。 在第一個“!”前面加上反斜杠(“ \\”)。 以文字“!”開頭的模式,例如“!important!.txt”。
如果該模式以斜杠結尾,則出於以下描述的目的將其刪除,但它只會找到與目錄匹配的內容。 換句話說,foo /將匹配目錄foo及其下的路徑,但不會匹配常規文件或符號鏈接foo(這與pathspec通常在Git中的工作方式一致)。
現在,我們有以下目錄結構:
/path/to/git/repo
|-- .gitignore
|-- /cache
|-- somefile
|-- README
|-- /dir
|-- somefile2
|-- README
而且我們要忽略cache /內的所有文件(自述文件除外)。
如果我們這樣指定gitignore:
/cache/**
!README
Git將忽略/cache/README
以外的所有內容。 其他自述文件將不會顯示,因為它的目錄/cache/dir
被/cache/**
排除在外, !README
甚至不適用於它。 為了解決這個問題,我們需要指定gitignore為:
# Ignore everything inside cache/ dir
/cache/**
# Except for subdirectories(won't be commited anyway if there is no commited file inside)
!/cache/**/
# And except for README files
!README
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.