忽略根目录中除某些特定文件、目录之外的所有文件

x-y*_*uri 2 git gitignore

我想这可以解决问题:

*
!/dir1/
!/dir2/
!/file1
!/file2
Run Code Online (Sandbox Code Playgroud)

但令我惊讶的是,事实并非如此。如果我在星号前加一个斜杠,它似乎可以工作。但我真的不明白为什么在这个改变之前它不起作用。有人能指点一下吗?

Lan*_*dys 6

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

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

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

# CANNOT work
*
!/dir1/
Run Code Online (Sandbox Code Playgroud)

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

作为比较,以下工作有效。

# works
/*
!/dir1/
Run Code Online (Sandbox Code Playgroud)

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

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

# CANNOT work
*
!/dir1/**
Run Code Online (Sandbox Code Playgroud)

原因在规则2中。

规则 2. 如果文件/目录的父目录仍然被忽略,则不会包含它们。对于这个规则,请先阅读我对一个SO问题的回答

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

# works
*
!/dir1/
!/dir1/**
Run Code Online (Sandbox Code Playgroud)

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

以下作品。

/*
!/dir1/
!/dir2/
!/file1
!/file2
Run Code Online (Sandbox Code Playgroud)

并且以下内容也有效。

*
!/dir1/
!/dir1/**
!/dir2/
!/dir2/**
!/file1
!/file2
Run Code Online (Sandbox Code Playgroud)

为了简单起见,如下所示。

*
!*/
!/dir1/**
!/dir2/**
!/file1
!/file2
Run Code Online (Sandbox Code Playgroud)