Git 忽略除特定目录外的文件

Git 忽略除特定目录外的文件,git,gitignore,Git,Gitignore,我正在创建一个包含PDF图像的LaTeX文档;因此,我想忽略生成的PDF,而不是源PDF。我确实做到了这一点,但我尝试的第一件事没有成功,我想知道为什么 报告部分说: 从路径所在目录下的.gitignore文件或任何父目录中读取的模式,高级文件(直至工作树的顶层)中的模式将被低级文件中的模式覆盖,直至包含该文件的目录。这些模式与.gitignore文件的位置相匹配。项目通常在其存储库中包含此类.gitignore文件,其中包含作为项目构建一部分生成的文件的模式 …但我似乎无法获得更深的.giti

我正在创建一个包含PDF图像的LaTeX文档;因此,我想忽略生成的PDF,而不是源PDF。我确实做到了这一点,但我尝试的第一件事没有成功,我想知道为什么

报告部分说:

从路径所在目录下的.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

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

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

我肯定您考虑过这个问题,但以防万一:您能将文件生成到Git无法访问的另一个目录吗?如果是这样的话,这会在很多方面产生影响。或者只是在git repo中专门为他们准备的目录中-需要在.gitignore中加一行才能包含它。@golergka是的,正如问题中所提到的,我成功地做了我需要做的事情(只需在我的顶级
.gitignore
文件中放入类似
*.pdf;!images/*.pdf
). 不过,我仍然很好奇,为什么问题中概述的方法不起作用。