忽略特定目录以外的文件

时间:2013-11-07 16:36:32

标签: git gitignore

我正在创建一个包含PDF图像的LaTeX文档;所以,我想忽略生成的PDF而不是源PDF。我实际上设法做到了这一点,但我尝试的第一件事没有用,我想知道原因。

documentation部分说:

  

从与路径相同的目录中的.gitignore文件读取的模式,或在任何父目录中读取的模式,其中较高级别文件中的模式(直到工作树的顶层)被较低级别文件中的模式覆盖到包含该文件的目录。这些模式相对于.gitignore文件的位置匹配。项目通常在其存储库中包含此类.gitignore文件,其中包含作为项目构建的一部分生成的文件的模式。

...但我似乎无法获得更深层的.gitignore文件来覆盖较浅的文件。这是一个简单的命令序列,用于重现我所看到的内容:

~% mkdir git-test
~% cd git-test
~/git-test% git init
Initialized empty Git repository in /home/dmwit/git-test/.git/
~/git-test% echo '*.pdf' >.gitignore
~/git-test% mkdir images
~/git-test% touch images/.gitignore
~/git-test% git add .gitignore images/.gitignore 
~/git-test% git commit -m "example .gitignore files"
[master (root-commit) 8c7e91d] example .gitignore files
 2 files changed, 1 insertion(+)
 create mode 100644 .gitignore
 create mode 100644 images/.gitignore
~/git-test% touch images/foo.pdf
~/git-test% git status
# On branch master
nothing to commit, working directory clean

为什么工作目录在此之后会干净? .gitignore中的空git-test/images/文件是否应该覆盖images/中的空文件,导致该目录中的任何内容都不会被忽略? (另外,在删除git-test/.gitignore后,新的pdf确实出现在git status中,因此我不相信我的任何全局排除都会对此产生影响。)

1 个答案:

答案 0 :(得分:2)

git不会覆盖子目录中的完整.gitignore文件。它将这些文件的内容添加到当前的忽略规则中。在您的特定情况下,处理该子目录(及其任何子目录...)时,空.gitignore文件将合并到忽略列表中,但由于该文件中没有规则,因此它是无操作。我建议a)尝试将"!*.pdf"放在.gitignore文件中,告诉它不要忽略那里的PDF文件,或者b)摆脱顶级*.pdf忽略规则,重新排列您的构建过程将生成的PDF文件放在一个单独的目录中(例如output/),然后在其中放置.gitignore,其中包含“* .pdf”规则。