【发布时间】:2014-10-01 16:05:36
【问题描述】:
我想这样做可以解决问题:
*
!/dir1/
!/dir2/
!/file1
!/file2
但令我惊讶的是,它没有。如果我在星号之前加上一个斜杠,它似乎可以工作。但我真的不明白为什么在这个改变之前它不起作用。谁能指出来?
【问题讨论】:
-
看看这是否能提供任何见解stackoverflow.com/questions/9162919/…
我想这样做可以解决问题:
*
!/dir1/
!/dir2/
!/file1
!/file2
但令我惊讶的是,它没有。如果我在星号之前加上一个斜杠,它似乎可以工作。但我真的不明白为什么在这个改变之前它不起作用。谁能指出来?
【问题讨论】:
要在.gitignore 中使用否定模式!,只需记住两条规则。
规则 1. 文件和目录在模式中分开处理。包含一个目录并不意味着它的子文件/目录也被包含在内。
I.E.目标是排除所有文件/目录,除了/dir1 中的所有内容。以下不起作用。
# CANNOT work
*
!/dir1/
为什么?原因只是第一条规则。虽然目录dir1 再次被包含,但不是它的所有子文件/目录。并且只包含没有子目录的目录对 git 没有任何意义,因为 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 重新包含最少数量的文件。