2014-10-01 95 views
2

我应该这样做的伎俩:忽略根的所有文件,除了一些特定的文件,目录

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

但出乎我的意料,它没有。这似乎工作,如果我在星号前加上斜线。但我不明白为什么在这个变化之前它不起作用。有人可以指出吗?

+0

看看这个大棚任何见解http://stackoverflow.com/questions/9162919/whitelisting-and-subdirectories-in-git – 2014-10-01 16:27:27

回答

3

要使用否定模式!.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 
+0

大。在我看来,'/ *'解决方案是最好的选择之一。因为它会让'git'重新包含最少量的文件。 – 2014-10-02 17:45:59

相关问题