Git忽略目录和目录/*有什么区别?

Aar*_*hen 108 git notation gitignore dotfiles

我对在git中忽略目录内容的正确方法感到困惑.

假设我有以下目录结构:

my_project  
     |--www  
         |--1.txt  
         |--2.txt
     |--.gitignore
Run Code Online (Sandbox Code Playgroud)

放这个有什么区别:

www
Run Code Online (Sandbox Code Playgroud)

还有这个?

www/*
Run Code Online (Sandbox Code Playgroud)

我问这个问题的原因是:在git中,如果目录为空,git将不会在存储库中包含这样的空目录.所以我正在尝试在目录下添加一个额外的.gitkeep文件的解决方案,这样它就不会是空的.当我尝试该解决方案时,如果在.gitignore文件中,我写如下:

www
!*.gitkeep
Run Code Online (Sandbox Code Playgroud)

它不起作用(我的意图是忽略www下的所有内容但保留目录).但如果我尝试以下方法:

www/* 
!*.gitkeep
Run Code Online (Sandbox Code Playgroud)

然后它的作品!所以我认为这两种方法之间必然存在一些差异.

Lan*_*dys 200

有间是差异www,www/www/*.

基本上从文档和我自己的测试中,www找到与文件或目录的www/匹配,只匹配目录,同时www/*匹配目录和文件www.

我只是会在之间的差异讨论www/,并www/*在这里,因为之间的差异wwwwww/显着.

因为www/,git忽略了目录www本身,这意味着git甚至不会查看内部.但是,对于www/*,git会检查内部的所有文件/文件夹www,并忽略所有这些文件/文件夹*.它似乎导致相同的结果,因为www如果忽略所有子文件/文件夹,git将不会跟踪空文件夹.事实上,结果将是OP的情况下没有差别www/www/*独立.但如果它与其他规则相结合,它确实会产生差异.

例如,如果我们只想包含www/1.txt但忽略其他所有内容www呢?

以下方法.gitignore无效.

www/
!www/1.txt
Run Code Online (Sandbox Code Playgroud)

虽然以下.gitignore工作,为什么?

www/*
!www/1.txt
Run Code Online (Sandbox Code Playgroud)

对于前者,git只是忽略了目录www,甚至不会再查看内部www/1.txt.第一个规则排除父目录www但不排除www/1.txt,因此www/1.txt不能" 再次包含 ".

但对于后者,git首先忽略所有文件/ folers www,然后再包含其中一个文件/ folers www/1.txt.

对于此示例,文档中的以下行可能有所帮助:

可选前缀"!" 否定了这种模式; 之前模式排除的任何匹配文件将再次包含在内.如果排除该文件的父目录,则无法重新包含文件.

  • 最后的实际例子的+1表示它们在否定模式情况下的不同之处.享受徽章:) (2认同)

dje*_*lin 8

我只是在解析文档,据我所知,他们只有不同的更高级的模式,例如

$ cat .gitignore
    # exclude everything except directory foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar
Run Code Online (Sandbox Code Playgroud)

没有测试上面,如果你更换!/foo!/foo/*,你确实得到了不同的结果.

注意

foo
Run Code Online (Sandbox Code Playgroud)

将排除任何文件foo,但是

foo/
Run Code Online (Sandbox Code Playgroud)

只会排除名为foo的目录.