gitignore:忽略文件夹层次结构中除一个特定文件类型之外的所有文件
我想忽略下面和文件夹中的所有文件,但文件夹层次结构中可能存在的特定文件类型除外: 范例gitignore:忽略文件夹层次结构中除一个特定文件类型之外的所有文件,git,gitignore,Git,Gitignore,我想忽略下面和文件夹中的所有文件,但文件夹层次结构中可能存在的特定文件类型除外: 范例 /Test /Test/unknown/folder/structure/below 现在,我想忽略Test文件夹中及其下的所有文件,但名为layout.css的特定css文件除外,例如: /Test/layout.css /Test/fileto.ignore /Test/another/folder/ig.nore /Test/in/a/unknown/folder/layout.css /Test/i
/Test
/Test/unknown/folder/structure/below
现在,我想忽略Test
文件夹中及其下的所有文件,但名为layout.css
的特定css文件除外,例如:
/Test/layout.css
/Test/fileto.ignore
/Test/another/folder/ig.nore
/Test/in/a/unknown/folder/layout.css
/Test/in/a/unknown/folder/ignore.me
.gitignore应该忽略
/Test/fileto.ignore
/Test/another/folder/ig.nore
/Test/in/a/unknown/folder/ignore.me
My.gitignore文件不工作:
Test/
!layout.css
有什么建议吗?我可以通过在
Test/
目录中放置一个.gitignore
文件来让您的示例工作,该文件包含以下内容
*
!*/
!.gitignore
!layout.css
为了实现你想要的,你需要使用一些消极的排除 基本思想是,您需要排除任何文件的每个父目录,而这些文件是您想要忽略的 因此,如果您希望将/Test/in/a/unknown/folder/layout.css添加到git repo中,那么您必须取消/gnore/Test/、/Test/in/、/Test/in/a/、/Test/in/a/unknown/、和/Test/in/a/unknown/folder/ 然后,当您最终到达包含一些被忽略和一些未被忽略文件的目录时,您需要按如下方式分别指定每个文件:
# Fille: .gitignore
!Test/
Test/*
!Test/layout.css
Test/fileto.ignore
!Test/another/
Test/another/*
!Test/another/folder/
Test/another/folder/*
!Test/in/
Test/in/*
!Test/in/a/
Test/in/a/*
!Test/in/a/unknown/
Test/in/a/unknown/*
!Test/in/a/unknown/folder/
Test/in/a/unknown/folder/ignore.me
!Test/in/a/unknown/folder/layout.css
因此,当您运行$git add all
时,您将看到所需的结果:
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: .gitignore
new file: Test/in/a/unknown/folder/layout.css
new file: Test/layout.css
$git状态
论分行行长
初始提交
要提交的更改:
(使用“git rm--cached…”取消存储)
新文件:.gitignore
新文件:Test/in/a/unknown/folder/layout.css
新文件:Test/layout.css
注意:您可以找到一个解释,解释为什么
git add all
是将文件添加到git repo的最佳方式,这个问题已经很老了,但由于我现在仍在为这个问题苦苦挣扎,我想我会分享这个问题的实际解决方案
问题是,虽然不能像被忽略一样提交Git中的空目录,但此规则不适用于.gitignore
从
尾随“/**”匹配内部的所有内容。例如,“abc/**”
匹配目录“abc”中相对于
.gitignore文件,具有无限深度
斜杠后跟两个连续的星号,然后斜杠匹配
零个或多个目录。例如,“a/**/b”匹配“a/b”,
“a/x/b”、“a/x/y/b”等
**匹配文件和目录中的所有内容
这就引出了GitDocs中的另一点:
可选前缀“!”否定模式;任何匹配的文件
被先前模式排除的将再次被包括<不是
如果文件的父目录为空,则可以重新包含该文件
已排除。Git不会列出性能排除的目录
原因,所以包含的文件上的任何模式都不会产生任何影响
定义它们的地方。在第一行前面加一个反斜杠(\)
“!”例如,对于以文字“!”开头的模式,
“!重要!.txt”
如果图案以斜线结尾,则出于以下目的将其删除:
下面的描述,但它将只找到具有
目录换句话说,foo/将匹配目录foo和路径
在它下面,但与常规文件或符号链接不匹配
foo(这与pathspec在
吉特)
现在,假设我们有一个如下的dir结构:
/path/to/git/repo
|-- .gitignore
|-- /cache
|-- somefile
|-- README
|-- /dir
|-- somefile2
|-- README
我们希望忽略缓存/中的所有文件,自述文件除外
如果我们这样指定gitignore:
/cache/**
!README
Git将忽略除/cache/README
之外的所有内容。另一个自述文件不会显示,因为它的目录/cache/dir
已被/cache/**
和排除!自述文件甚至不适用于它。
要解决此问题,我们需要将gitignore指定为:
# Ignore everything inside cache/ dir
/cache/**
# Except for subdirectories(won't be commited anyway if there is no commited file inside)
!/cache/**/
# And except for README files
!README
你也试过其他顺序吗?@Jan是的,我试过了-不幸的是没有成功参见:集中解决方案。David,谢谢你的回答。因为我有很多Test
文件夹,所以我更喜欢“集中式”解决方案,而不是让各种.gitignore文件贯穿始终。@Jörg不幸的是,我找不到一种方法来做到这一点。您可能已经尝试调整我的解决方案,并在顶级目录中使用它,方法是在前两行添加Test
(并删除第三行)。如果您这样做了,您会发现这并不能解决问题。希望有人知道如何提供一个更完整的解决方案。是的,我尝试了各种组合和您的解决方案的一些变体,但正如您所说,它不起作用。无论如何,谢谢你花时间。令人惊讶的是,这是唯一一个真正回答原始问题的答案。确认这对我有效。拥有是至关重要的/cache/***/
(来自此处)