Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 忽略根目录中除某些特定文件、目录外的所有文件_Git_Gitignore - Fatal编程技术网

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

Git 忽略根目录中除某些特定文件、目录外的所有文件,git,gitignore,Git,Gitignore,我想这会起作用: * !/dir1/ !/dir2/ !/file1 !/file2 但令我惊讶的是,事实并非如此。如果我在星号前加一个斜杠,这似乎有效。但我真的不明白为什么在这改变之前它不起作用。有人能指出吗?使用否定模式在.gitignore中,记住两条规则 规则1。在模式中分别处理文件和目录。将目录包括回并不意味着其子文件/目录也包括回。 即,目标是排除所有文件/目录,但/dir1中的所有内容除外。以下方法不起作用 # CANNOT work * !/dir1/ 为什么??原因只是第一

我想这会起作用:

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

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

使用否定模式
.gitignore
中,记住两条规则

规则1。在模式中分别处理文件和目录。将目录包括回并不意味着其子文件/目录也包括回。

即,目标是排除所有文件/目录,但
/dir1
中的所有内容除外。以下方法不起作用

# CANNOT work
*
!/dir1/
为什么??原因只是第一条规则。虽然目录
dir1
再次包含,但并非所有子文件/目录都包含在内。只包含没有子目录的目录对git来说毫无意义,因为git不会跟踪空文件夹

作为比较,下面的工作

# works
/*
!/dir1/
/*
!/dir1/
!/dir2/
!/file1
!/file2
为什么??因为
/*
只直接匹配根目录下的文件/目录,而不忽略子目录下的任何文件/目录,例如
dir1
。在
之后/dir1/
包含
dir1
back,其所有子文件/目录都自然返回

有人可能会问,既然
,为什么下面的方法不起作用/dir1/**
将包括
dir1的所有子文件/目录
back

# CANNOT work
*
!/dir1/**
原因在规则2中

规则2。如果文件/目录的父目录仍然被忽略,它将不包括返回的文件/目录。有关此规则,请先阅读

这就是为什么以前的模式不起作用。如果我们先添加另一个求反模式来包含父目录
dir1
back,它就会工作

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

在理解了这两条规则之后,OP案例的解决方案非常简单

下面的工作

# works
/*
!/dir1/
/*
!/dir1/
!/dir2/
!/file1
!/file2
下面的方法也适用

*
!/dir1/
!/dir1/**
!/dir2/
!/dir2/**
!/file1
!/file2
让它变得简单如下

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

看看这会不会让你有什么深刻的见解。在我看来,
/*
解决方案是最好的选择。因为它使
git
重新包含的文件量最少。