2014-09-06 74 views
1

想象一下以下結構:忽略子目錄下的所有文件和文件,除了一個文件

/a/1.txt 
/a/2.txt 
/a/.keep 

/a/b/1.txt 
/a/b/2.txt 
/a/b/3.txt 
/a/b/.keep 

/a/b/c/1.txt 
/a/b/c/2.txt 
/a/b/c/3.txt 
/a/b/c/4.txt 
/a/b/c/.keep 

/d/test.txt 
/d/work.txt 

我想忽略a目錄中的所有文件,除了.keep文件,得到如下結果:

/a/.keep 

/a/b/.keep 

/a/b/c/.keep 

/d/test.txt 
/d/work.txt 
我的 .gitignore文件不起作用:

回答

2

可惜的是,你不能用以前的規則,忽略重新納入目錄的文件,根據gitignore Documentation

這是不可能重新納入一個文件,如果該文件的父目錄中排除。由於性能原因,Git沒有列出排除的目錄,因此無論它們被定義在何處,包含文件的任何模式都不起作用。

所以這

/a/* 
!/a/**/.keep 

只會重新加入/a/.keep而不是其他。

您必須明確排除/a下的每個文件模式。

/a/**/*.txt 
/a/**/.ignore 
/a/**/.alsoignore 

UPDATE:還是一個更好的解決辦法是在你的/a子目錄創建以下.gitgnore

*.* 
!.keep 

(唯一的缺點是,這種解決方案也將不斷檔不帶擴展名)

+0

您能推薦任何其他解決方案嗎? – acelot 2014-09-06 13:27:25

+0

感謝您提供最後的解決方案! – acelot 2014-09-06 13:46:23

+0

@PiONeeR,you're歡迎! – ericbn 2014-09-06 13:47:18

0

在你的情況,你應該使用:

/a/* 
!**/.keep 

gitignore文檔:

一家領先的 「**」,後跟一個斜線意味着所有目錄匹配。例如,對於 示例,「**/foo」與任何地方的文件或目錄「foo」相匹配,與模式「foo」相同 。 「**/foo/bar」與直接在目錄「foo」下的任何地方的文件或目錄「bar」 相匹配。

+0

從PhpStorm IDE有截圖https://www.dropbox.com/s/molz4emls4ixayw/%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE %D1%82%202014-09-06%2023.10.11.png?dl = 0 – acelot 2014-09-06 13:14:10

+0

由於您ca n參見.gitkeep文件仍然被git忽略 – acelot 2014-09-06 13:15:12

+0

該文檔還指出:「如果排除該文件的父目錄,則不可能重新包含文件。由於性能原因,Git不會列出排除的目錄,因此,無論在何處定義,包含文件的任何模式都不起作用。「 – ericbn 2014-09-06 13:31:31

相關問題