我想忽略下面和文件夹中的所有文件,除了特定文件类型可能在文件夹层次结构中的某个位置:
例
/Test
/Test/unknown/folder/structure/below
Run Code Online (Sandbox Code Playgroud)
现在我想忽略文件Test
夹内部和下面的所有文件,除了某个名为的css文件layout.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
Run Code Online (Sandbox Code Playgroud)
.gitignore应该忽略
/Test/fileto.ignore
/Test/another/folder/ig.nore
/Test/in/a/unknown/folder/ignore.me
Run Code Online (Sandbox Code Playgroud)
我的.gitignore文件不起作用:
Test/
!layout.css
Run Code Online (Sandbox Code Playgroud)
有什么建议?
Dav*_*ber 28
通过将.gitignore
文件放在Test/
具有以下内容的目录中,我能够使您的示例工作.
*
!*/
!.gitignore
!layout.css
Run Code Online (Sandbox Code Playgroud)
l3x*_*l3x 11
为了达到你想要的效果,你需要使用一些负面的排除.
基本思想是您需要排除任何您想要取消签名的文件的每个父目录.
所以,如果你想将/Test/in/a/unknown/folder/layout.css添加到你的git仓库,那你就必须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
Run Code Online (Sandbox Code Playgroud)
因此,当你跑步时,$ 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
Run Code Online (Sandbox Code Playgroud)
注意:您可以git add-all
在http://lexsheehan.blogspot.com/2014/05/git-add-update.html找到有关将文件添加到git仓库的最佳方法的原因的说明.
相当古老的问题,但由于我现在正在努力解决这个问题,我想我会分享问题的实际解决方案.
问题是你不能在Git中提交空目录,就好像它们被忽略一样,这个规则不适用于.gitignore
.
来自https://git-scm.com/docs/gitignore
尾随"/**"匹配内部的所有内容.例如,"abc/**"匹配目录"abc"内的所有文件,相对于.gitignore文件的位置,具有无限深度.
斜杠后跟两个连续的星号,然后斜杠匹配零个或多个目录.例如,"a/**/b"匹配"a/b","a/x/b","a/x/y/b"等.
**匹配内部的一切 - 文学上的一切 - 文件和目录.
这引出了我们在gitignore文档中的另一点:
可选前缀"!" 否定了这种模式; 之前模式排除的任何匹配文件将再次包含在内.如果排除该文件的父目录,则无法重新包含文件.出于性能原因,Git不会列出排除的目录,因此无论在何处定义,所包含文件的任何模式都不起作用.在第一个"!"前放一个反斜杠("\")对于以文字"!"开头的模式,例如"!important!.txt".
如果模式以斜杠结尾,则为了以下描述的目的将其删除,但它只会找到与目录的匹配项.换句话说,foo /将匹配目录foo和它下面的路径,但是不匹配常规文件或符号链接foo(这与pathpec在Git中的工作方式一致).
现在,假设我们有一个以下的dir结构:
/path/to/git/repo
|-- .gitignore
|-- /cache
|-- somefile
|-- README
|-- /dir
|-- somefile2
|-- README
Run Code Online (Sandbox Code Playgroud)
我们希望忽略缓存中的所有文件/ README文件除外.
如果我们像这样指定gitignore:
/cache/**
!README
Run Code Online (Sandbox Code Playgroud)
Git会忽略除了之外的所有内容/cache/README
.其他自述不会显示出来,因为它的目录/cache/dir
中排除与/cache/**
和!README
甚至不会适用于它.要解决这个问题,我们需要指定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
Run Code Online (Sandbox Code Playgroud)