我应该这样做的伎俩:忽略根的所有文件,除了一些特定的文件,目录
*
!/dir1/
!/dir2/
!/file1
!/file2
但出乎我的意料,它没有。这似乎工作,如果我在星号前加上斜线。但我不明白为什么在这个变化之前它不起作用。有人可以指出吗?
我应该这样做的伎俩:忽略根的所有文件,除了一些特定的文件,目录
*
!/dir1/
!/dir2/
!/file1
!/file2
但出乎我的意料,它没有。这似乎工作,如果我在星号前加上斜线。但我不明白为什么在这个变化之前它不起作用。有人可以指出吗?
要使用否定模式!
在.gitignore
,只记得2条规则。
规则1.文件和目录在模式中分开处理。包含一个目录并不意味着它的子文件/目录也被包含在后面。
I.E.目标是排除除/dir1
以外的所有文件/目录。以下不起作用。
# CANNOT work
*
!/dir1/
为什么?原因只是第一条规则。虽然目录dir1
被再次包括,但不是所有的子文件/目录。只有包含没有其子代的目录意味着什么都不要乱,因为git不会跟踪空文件夹。
作为比较,以下作品。
# works
/*
!/dir1/
为什么?因为/*
只能直接匹配根目录下的文件/目录,而不会忽略子目录下的任何文件/目录,如dir1
。在!/dir1/
包含dir1
之后,它的所有子文件/目录都回来了。
有人会问,如果是这样,为什么以下不起作用,因为!/dir1/**
会包含所有子文件/目录dir1
?
# CANNOT work
*
!/dir1/**
的原因是在规则2
规则2.不包括的文件/目录回来,如果他们的父目录是被忽略。对于此规则,请首先阅读my answer to a SO question。
这就是为什么以前的模式将无法正常工作。如果我们添加另一个否定模式以便首先包含父目录dir1
,它就可以工作。
# works
*
!/dir1/
!/dir1/**
理解2条规则后,对OP的情况下,解决方案是非常简单的。
以下的作品。
/*
!/dir1/
!/dir2/
!/file1
!/file2
以下内容也适用。
*
!/dir1/
!/dir1/**
!/dir2/
!/dir2/**
!/file1
!/file2
为了简化如下。
*
!*/
!/dir1/**
!/dir2/**
!/file1
!/file2
大。在我看来,'/ *'解决方案是最好的选择之一。因为它会让'git'重新包含最少量的文件。 – 2014-10-02 17:45:59
看看这个大棚任何见解http://stackoverflow.com/questions/9162919/whitelisting-and-subdirectories-in-git – 2014-10-01 16:27:27