【问题标题】:Ignore all the files in the root except for some particular files, directories忽略根目录下的所有文件,除了一些特定的文件、目录
【发布时间】:2014-10-01 16:05:36
【问题描述】:

我想这样做可以解决问题:

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

但令我惊讶的是,它没有。如果我在星号之前加上一个斜杠,它似乎可以工作。但我真的不明白为什么在这个改变之前它不起作用。谁能指出来?

【问题讨论】:

标签: git gitignore


【解决方案1】:

要在.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 重新包含最少数量的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 2019-09-12
相关资源
最近更新 更多