我想忽略下面和文件夹中的所有文件,除了特定文件类型可能位于文件夹层次结构中的某个位置:
示例
/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
我的.gitignore文件不起作用:
Test/
!layout.css
有什么建议吗?
答案 0 :(得分:27)
我能够通过将.gitignore
文件放在Test/
目录中以及以下内容来使您的示例工作。
*
!*/
!.gitignore
!layout.css
答案 1 :(得分:11)
为了达到您想要的效果,您需要使用一些否定排除。
基本思想是你需要排除任何你想要无条件的文件的每个父目录。
所以,如果你想将/Test/in/a/unknown/folder/layout.css添加到你的git repo中,那么你必须unignore / 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 add-all
是将文件添加到http://lexsheehan.blogspot.com/2014/05/git-add-update.html
答案 2 :(得分:9)
相当古老的问题但是因为我现在正在努力解决这个问题,所以我想我会分享这个问题的实际解决方案。
事情是,当您无法在Git中提交空目录时,就好像它们被忽略一样,此规则不适用于.gitignore
。
来自https://git-scm.com/docs/gitignore
尾随“/ **”匹配内部的所有内容。例如,“abc / **” 匹配目录“abc”内的所有文件,相对于位置 .gitignore文件,具有无限深度。
斜线后跟两个连续的星号,然后斜线匹配 零个或多个目录。例如,“a / ** / b”匹配“a / b”, “a / x / b”,“a / x / y / b”等等。
**匹配内部的一切 - 文学上的一切 - 文件和目录。
这引出了我们在gitignore docs中的另一个观点:
可选前缀“!”否定了这种模式;任何匹配的文件 被先前模式排除的将被再次包括在内。 不是 如果该文件的父目录是,则可以重新包含文件 排除。 Git不会列出排除目录的性能 原因,所以包含文件的任何模式都没有效果,无论如何 他们被定义的地方。在第一个前面放一个反斜杠(“\”) “!”对于以文字“!”开头的模式,例如, “!重要!.TXT”。
如果图案以斜线结尾,则会将其删除 以下描述,但它只会找到一个匹配 目录。换句话说,foo /将匹配目录foo和路径 在它下面,但不匹配常规文件或符号链接 foo(这与pathspec一般工作的方式一致 GIT)。
现在,假设我们有一个以下的目录结构:
/path/to/git/repo
|-- .gitignore
|-- /cache
|-- somefile
|-- README
|-- /dir
|-- somefile2
|-- README
我们希望忽略缓存中的所有文件/ README文件除外。
如果我们像这样指定gitignore:
/cache/**
!README
Git会忽略/cache/README
以外的所有内容。其他自述文件不会显示,因为/cache/dir
排除了目录/cache/**
,!README
甚至不会应用# 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
。
要解决这个问题,我们需要指定gitignore:
.sidebar {
display: flex;
align-items: center;
justify-content: center;
// other properties follow
}