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/*在这里,因为之间的差异www和www/显着.
因为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.
对于此示例,文档中的以下行可能有所帮助:
可选前缀"!" 否定了这种模式; 之前模式排除的任何匹配文件将再次包含在内.如果排除该文件的父目录,则无法重新包含文件.
我只是在解析文档,据我所知,他们只有不同的更高级的模式,例如
$ 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的目录.