.gitignore排除不适用于单个文件

jco*_*lum 8 git macos bash

$ git --version
git version 2.6.4
Run Code Online (Sandbox Code Playgroud)

我意识到这是一个重复,但另一个问题的答案没有帮助.

文件夹结构

/
-- dist/
---- samples/ 
---- README.md
---- foo/
---- bar/
---- baz.js 
Run Code Online (Sandbox Code Playgroud)

除了samples和README.md之外,我想忽略dist中的所有内容.我的前几次尝试都没有用,所以我决定放弃自述文件:

dist
!dist/samples/README.md 
Run Code Online (Sandbox Code Playgroud)

README是一个全新的文件.dist文件夹根本不在源代码管理中.但是当我检查忽略时,它仍然被忽略:

$ git check-ignore dist/samples/README.md 
dist/samples/README.md
$ git check-ignore src
   # empty line    
Run Code Online (Sandbox Code Playgroud)

我试过了:

  1. 改变忽略的顺序
  2. 从行的开头删除斜杠
  3. 在中间添加**: dist/**/README.md
  4. 在第一行/*的末尾添加一个dist

唯一被忽略的是*.js,*.js.map,temp和node_modules.有趣的是,Webstorm认为文件没有被忽略(它会改变颜色),但命令行工具确实认为它被忽略了.

我不明白我做错了什么.模式似乎很简单:

  1. 忽略此目录中的所有内容
  2. 不要忽视这一件事

但它显然不起作用.

pok*_*oke 28

问题仅仅是因为您忽略了目录dist.所以Git将不再查看目录以查找其他文件.

正如在解释这个相关的答案,你需要加入白名单的目录,只有忽略它的内容.由于你有一个嵌套的结构,这最终会有点复杂:

# ignore everything in the `dist` folder
dist/*
# … but don’t ignore the `dist/samples` folder
!dist/samples/
# … but ignore everything inside that `dist/samples` folder
dist/samples/*
# … except the `README.md` there
!dist/samples/README.md
Run Code Online (Sandbox Code Playgroud)

gitignore文档中也明确提到了这一点(强调我的):

一个可选的前缀" !",它否定了模式; 之前模式排除的任何匹配文件将再次包含在内.如果排除该文件的父目录,则无法重新包含文件.出于性能原因,Git不会列出排除的目录,因此无论在何处定义,所包含文件的任何模式都不起作用.