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
重新包含的文件量最少。