git - 忽略根目录下的所有文件,除了一些特定的文件、目录

标签 git gitignore

我认为这可以解决问题:

*
!/dir1/
!/dir2/
!/file1
!/file2

但令我惊讶的是,它没有。如果我在星号前加一个斜杠,它似乎可以工作。但我真的不明白为什么在这个改变之前它不起作用。谁能指出来?

最佳答案

要在 .gitignore 中使用否定模式 !,只需记住 2 条规则。

规则 1. 文件和目录在模式中分开处理。将目录包含回去并不意味着它的子文件/目录也包含回来。

即目标是排除除 /dir1 内的所有文件/目录之外的所有文件/目录。以下不起作用。

# CANNOT work
*
!/dir1/

为什么?原因只是第一条规则。虽然目录 dir1 再次被包含,但不是它的所有子文件/目录。并且只包含没有子目录的目录对 git 没有任何意义,因为 git 不会跟踪空文件夹。

作为比较,以下工作。

# works
/*
!/dir1/

为什么?因为/*只直接匹配根目录下的文件/目录,而不会忽略这里的dir1等子目录下的任何文件/目录。 !/dir1/ 包含 dir1 后,其所有子文件/目录自然返回。

有人可能会问,如果是这样,为什么下面的代码不起作用,因为 !/dir1/** 将包括 dir1 的所有子文件/目录?

# CANNOT work
*
!/dir1/**

原因在规则 2 中。

规则 2。如果文件/目录的父目录仍然被忽略,则不会将其包括回来。关于此规则,请阅读 my answer to a SO question首先。

这就是为什么以前的模式不起作用的原因。如果我们添加另一个否定模式以首先包含父目录 dir1,它就可以工作。

# works
*
!/dir1/
!/dir1/**

理解了这两条规则后,OP案例的解决方案就很简单了。

以下作品。

/*
!/dir1/
!/dir2/
!/file1
!/file2

下面的也行。

*
!/dir1/
!/dir1/**
!/dir2/
!/dir2/**
!/file1
!/file2

为了简单起见,如下。

*
!*/
!/dir1/**
!/dir2/**
!/file1
!/file2

关于git - 忽略根目录下的所有文件,除了一些特定的文件、目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26145657/

相关文章:

git - 如何 gitignore Go 二进制文件?

git - 如何推送 .gitignore 中指定的文件?

git - 获取 gitk 以显示完整的标签名称

git - 阻止 git 处理 "safe deleting"未 merge 的分支

git - 是什么导致损坏的 git 索引文件

git - 显示特定目录中最近提交中更改的文件列表

Gitignore 除了扩展名为 .rst 的文件之外的所有文件?

matlab - 使用 MATLAB 和 Simulink 时,我应该将哪些文件添加到 .gitignore?

git - 如何在不删除文件的情况下将文件添加到我的 .gitignore 中?

gitignore 没有扩展名的二进制文件