协慌网

登录 贡献 社区

.gitignore 排除文件夹但包含特定的子文件夹

我有文件夹 application / 我添加到. gitignore。应用程序 / 文件夹内是文件夹 application / language / gr。我该如何包含此文件夹?我试过这个

application/
!application/language/gr/

没有运气......

答案

如果您排除application/ ,那么它下面的所有内容将始终被排除(即使某些后来的否定排除模式(“unignore”)可能与application/下的内容相匹配)。

要做你想做的事,你必须 “unignore” 任何你想要 “unignore” 的东西的父目录。通常,您最终会成对编写针对此情况的规则:忽略目录中的所有内容,但不忽略某些子目录。

# you can skip this first one if it is not already excluded by prior patterns
!application/

application/*
!application/language/

application/language/*
!application/language/gr/

注意
尾随/*很重要:

  • 模式dir/排除名为dir和(隐式)其下的所有内容。
    使用dir/ ,Git 永远不会在dir下查看任何内容,因此永远不会将任何 “un-exclude” 模式应用于dir下的任何内容。
  • dir/*模式没有说明dir本身; 它只是排除了dir下的所有内容。使用dir/* ,Git 将处理dir的直接内容,使其他模式有机会 “取消排除” 某些内容( !dir/sub/ )。

提交 59856de卡斯滕 Blees(kblees) GIT 中 1.9 / 2.0(Q1 2014)阐明这种情况下:

gitignore.txt :澄清排除目录的递归性质

一个可选的前缀 “ ! ”,它否定了模式; 之前模式排除的任何匹配文件将再次包含在内。

如果排除该文件的父目录,则无法重新包含文件。 ( *
* :除非在 git 2.8 + 中满足某些条件,见下文)
出于性能原因,Git 不会列出排除的目录,因此无论在何处定义,所包含文件的任何模式都不起作用。

对于以文字 “ ! ” 开头的模式,在第一个 “ ! ” 前加一个反斜杠(“ \ ”),例如 “ \!important!.txt ”。

示例排除除特定目录foo/bar之外的所有内容(注意/* - 没有斜杠,通配符也会排除foo/bar所有内容):

--------------------------------------------------------------
     $ cat .gitignore
     # exclude everything except directory foo/bar
     /*
     !/foo
     /foo/*
     !/foo/bar
 --------------------------------------------------------------

在你的情况下:

application/*
!application/**/
application/language/*
!application/language/**/
!application/language/gr/**

在能够列出给定文件夹中的文件之前,必须先将文件夹列入白名单。


2016 年 2 月 / 3 月更新:

请注意,使用 git 2.9.x / 2.10(2016 年中期?), 如果重新包含的路径中没有通配符 ,则可以重新包含该文件(如果排除该文件的父目录)。

NguyễnTháiNgọcDuy( pclouds正在尝试添加此功能:

所以使用 git 2.9+,这可能实际上有效,但最终还原了:

application/
!application/language/gr/

@Chris Johnsen 的答案很棒,但是对于更新版本的 Git(1.8.2 或更高版本),你可以使用双星号模式来获得更简便的解决方案:

# assuming the root folder you want to ignore is 'application'
application/**/*

# the subfolder(s) you want to track:
!application/language/gr/

这样,您就不必 “unignore” 要跟踪的子文件夹的父目录。


使用 Git 2.17.0(不确定此版本的早期版本。可能会回到 1.8.2),使用**模式结合每个子目录的排除导致文件工作。例如:

# assuming the root folder you want to ignore is 'application'
application/**

# Explicitly track certain content nested in the 'application' folder:
!application/language/
!application/language/gr/
!application/language/gr/** # Example adding all files & folder in the 'gr' folder
!application/language/gr/SomeFile.txt # Example adding specific file in the 'gr' folder