簡體   English   中英

gitignore:忽略文件夾層次結構中的所有文件,除了一種特定的文件類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM