在已经gitignored目录中的一个特定目录上排除git ignore

时间:2016-09-16 04:56:51

标签: git visual-studio

我的gitignore文件目前如下所示:

# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
**/wwwroot/lib/
**/wwwroot/_references.js
**/wwwroot/app/**/*.js*
**/wwwroot/css/**/*.min.css
**/wwwroot/js/**/*.min.js
**/wwwroot/bundles/**/*.bundle.min.js

基本上我想忽略wwwroot/lib/目录中的所有文件,但lib中的特定目录除外:/wwwroot/lib/file-tester

如何使用.gitignore执行此操作?我已经阅读了感叹号语法,但它不起作用,可能是由于忽略的顺序。我尝试过如下:

# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
**/wwwroot/lib/
!/wwwroot/lib/file-tester
**/wwwroot/_references.js
**/wwwroot/app/**/*.js*
**/wwwroot/css/**/*.min.css
**/wwwroot/js/**/*.min.js
**/wwwroot/bundles/**/*.bundle.min.js

但它没有用。任何帮助将不胜感激。

提前致谢!

4 个答案:

答案 0 :(得分:0)

首先,我不确定你为何过度使用**。如果你有一个目录/ wwwroot / lib,你可以忽略它:

/wwwroot/lib/

至于你对目录的否定,我认为你只需要指定它是你所指的目录,结尾是反斜杠:

!/wwwroot/lib/file-tester/

答案 1 :(得分:0)

它不起作用,因为您排除了整个/wwwroot/lib/目录而不是它的内容。忽略此目录的模式应如下所示:

/wwwroot/lib/*
!/wwwroot/lib/file-tester

答案 2 :(得分:0)

/ *救援

目录排除语法的细微变化在这里很有用:

$ cat .gitignore
wwwroot/lib/*
!wwwroot/lib/file-tester

注意尾随/*是重要的,并告诉git排除lib文件夹中的所有内容,但不排除lib文件夹本身。细微差别在于,如果第一行是wwwroot/lib,则告诉git忽略wwwroot/lib目录本身,然后不排除'取消排除'模式会产生任何影响。而是使用尾随/*,我们传达给git以排除目录的内容,允许后续排除模式起作用。我已经测试了这个工作,如下所示:

# Create a directory which should be excluded
$ mkdir -p wwwroot/lib/dir-to-exclude && touch wwwroot/lib/dir-to-exclude/empty.txt

# Now confirm that the above directory, file is not tracked by git
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
    .gitignore
    wwwroot/lib/file-tester/empty2.txt

(在git v.2.10.0上测试)

检查哪个规则排除文件

$ git check-ignore -v wwwroot/lib/dir-to-exclude
.gitignore:1:wwwroot/lib/*  wwwroot/lib/dir-to-exclude

使用带有目录排除的感叹语法,您要实现的目标:

  

基本上我想忽略wwwroot / lib /目录下的所有文件,但lib中的特定目录除外:/ wwwroot / lib / file-tester

是不可能的。

来自https://git-scm.com/docs/gitignore

  

可选前缀"!"否定了这种模式;之前模式排除的任何匹配文件将再次包含在内。 如果排除该文件的父目录,则无法重新包含文件。由于性能原因,Git不会列出排除的目录,因此所包含文件的任何模式都无效,无论如何他们被定义的地方。在第一个"!"前面放一个反斜杠(" \")对于以文字"!"开头的模式,例如"!important!.txt"。

如果您排除wwwroot/lib,则无法再通过!wwwroot/lib/file-tester包含任何子目录。我已经在测试库上对此进行了测试,并且可以确认:

$ touch wwwroot/lib/file-tester/empty2.txt

$ cat .gitignore
!wwwroot/lib/file-tester
wwwroot/lib

$ git status
Untracked files:
    .gitignore

$ vim .gitignore #Edited to remove wwwroot/lib
$ cat .gitignore
!wwwroot/lib/file-tester

$ git status
Untracked files:
    .gitignore
    wwwroot/lib/file-tester/empty2.txt

(这是在https://github.com/ajorpheus/git-ignore-test上测试的) 请注意,只要删除wwwroot/lib,文件wwwroot/lib/file-tester/empty2.txt就会被git识别为未跟踪的文件。

答案 3 :(得分:0)

以下定义有效。

**/wwwroot/lib
**/wwwroot/lib/*.*