无法取消忽略 GIT 子目录

Not able to un-ignore GIT sub-directory

很简单,我想取消忽略已忽略目录中的子目录。

我的.gitignore:

app/migrations/
!app/migrations/config/Migrations/*

它不起作用,如果我删除第一行 app/migrations 未被忽略,但第二行没有按预期工作。我也试过:

!app/migrations/config/*

但是似乎无法取消忽略?

更新

这似乎是 GIT 的一个缺点,它不能正确支持取消忽略子目录。令人惊讶的是,这样一个标准工具无法支持如此简单的配置,无论是疏忽还是错误。

根据 Git 文档:

It is not possible to re-include a file if a parent directory of that file is excluded.

如果您取消忽略所有文件夹,直到您想要的文件夹,才有可能实现您想要的效果:

app/migrations/*

!app/migrations/config/*

app/migrations/config/*

!app/migrations/config/Migrations/*

可能与

重复

正如更新中提到的,我试图实现的目标没有得到适当的支持,我几乎可以实现我想要的目标:

app/migrations/
!app/migrations
app/migrations/config/
!app/migrations/config
app/migrations/config/Migrations/
!app/migrations/config/Migrations

简而言之,您必须忽略然后取消忽略每个子目录。然而,这并不是 100% 有效,因为 app/migrations/config/* 在应该是 app/migrations/config/Migrations 时未被忽略。更重要的是,这不仅过于复杂,而且还导致几乎不可读和臃肿的 git-ignore 文件 - 6 行只是为了取消忽略子目录。

希望这能帮助那些被这个限制绊倒的人。

这会起作用,并且从根开始 .gitignore 是最短的序列可以有效地起作用:

app/migrations/*
!app/migrations/config
app/migrations/config/*
!app/migrations/config/Migrations

(第二行写成!app/migrations/config/可能更清楚更明确但是只要config一个目录,效果就是相同。请参阅下面我的附加说明。)

In short you have to ignore then un-ignore each sub-directory.

这是正确的,因为当 目录 实际上被忽略时(根据最后一个匹配的 .gitignore 规则),这将 Git 权限授予 完全忽略扫描目录。因此,它永远不会看到该目录中的 any 文件或子目录。然而,它非常有效:Git 从来不需要 打开 目录!这就是为什么这条规则如此运作的原因。

However this does not work 100% since app/migrations/config/* is un-ignored when it should only be app/migrations/config/Migrations.

那是因为你说要那样做。说按照你的意思去做,你就可以了。 :-)

What's more this is not only over-complicated but also makes for an almost unreadable and bloated git-ignore file - 6 lines just to un-ignore a sub-sub-directory.

嗯,四行。也就是说,我同意这太复杂了。 Git 应该识别模式:

dir/*
!dir/sub/something

并自动插入适当的 !dir/sub/。同样适用于:

dir/*
!dir/sub1/sub2/something

这里,Git可以根据需要自动插入!dir/sub1/!dir/sub1/sub2/规则,并根据需要相应的“忽略所有文件”规则。这些未忽略的插入应以 / 结尾,以防 dir/subdir/sub1、and/or dir/sub1/sub2 是文件而不是目录。