如何在.gitignore文件中排除特定文件夹下的所有直接文件但包含该文件夹下的所有子文件夹?

3

我希望排除文件夹reports中的所有直接文件,但包括所有子文件夹。起初我不知道在这个文件夹中是否有子文件夹,所以我推送了reports/*来避免自动生成报告的推送。但现在,所有子文件夹中的模板文件都被标记为删除状态,我想修复这个问题:

排除:

  • reports/report1.pdf
  • reports/report2.txt
  • reports/report3PlainFile
  • ...

包括:

  • reports/A/a_1_template.rpt
  • reports/A/a_2_template.rpt
  • reports/B/a_2_template.rpt
  • ...

我尝试过:

    reports/*
    !reports/*/

并且

    reports/*
    !reports/*/*

但似乎它不起作用。

现在,reports 文件夹中的所有内容都被排除了。 但是我只想排除直接文件,并包含所有子文件夹(和它们的内容)。

3个回答

1

.gitignore 文件内容:

/*
!/*/

首先忽略一切,然后从最后一个匹配项(everything)递归地排除文件夹。 更新
folder/*
!folder/*/

如果您在响应中添加实际的文件夹名称,我将标记它为已接受。例如:folder/*!folder/*/ - zingi
1
它适用于所有文件夹及其子文件夹,但不包括根文件(通用解决方案)。如果只需要包含某些文件夹,则应在所需级别更改为!folder/*/ - Xaqron

0
请注意,在.gitignore文件中,您只能排除文件。 为了专注于您的问题,答案是您必须手动导航到每个文件,并保持嵌套路径不变。
但总的来说:
首先,您必须以以下方式启动.gitignore文件:
*/**/.gitignore

这样git就不会将此文件共享,并继续进行操作。

**/target/*   
**/*.xml

这个想法是将文件本身包含进来

filename.xml

或者通过导航使用*,在xml行中排除所有类型为.xml的文件,而在目标中排除此文件包含的所有文件。

希望这能帮到你。


1
你的回答并没有回答我的问题。 我的问题与Intellij无关。 - zingi
重点不在于文件类型,而在于您导航到文件的方式。 - Antonis
1
但是我还不知道生成的文件扩展名。它们是即时生成的。它们可以是 .pdf 或 .txt 或者其他我之前不知道的格式。 - zingi

0

其实:

    reports/*
    !reports/*/

已解决。问题出在其他地方。

我将reports/*推送到分支A并合并到分支B。

因此,所有模板文件仍然存在于分支A中,但在分支B的暂存区中被标记为已删除。所以我切换回分支A,在.gitignore文件中添加了!reports/*/。然后我第二次将分支A合并到分支B,并且丢弃了分支B暂存区中的所有内容,现在子文件夹(和内容)已经回到分支B中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接