我有文件夹 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