繁体   English   中英

Git,设置.gitignore 忽略所有文件EXCEPT.conf 文件,也包括子目录

[英]Git, set up .gitignore to ignore all files EXCEPT .conf files, including subdirectories too

如何让Git忽略目录中的所有文件以及除 .conf 文件之外的子目录中的所有文件?

目前我在 my.gitignore 中有这个:

!/some/dir/
/some/dir/*
!/some/dir/**/
!/some/dir/**/*.conf

所以,我想忽略 /some/dir/ 及其子目录中的所有文件,*.conf 文件除外。

但它不会忽略 /some/dir/ 中的任何文件。

例如,/some/dir/somefile 不是忽略,/some/dir/subdir/anotherfile 也不是忽略。 我只想不忽略以下文件:/some/dir/subdir/file.conf。

您可能希望以各种方式对此进行调整,但这是我所知道的最简单的方法,可以满足您的要求。 some/dir中创建一个.gitignore文件,内容为:

*
!*/
!*.conf

一切就绪。

这是一个例子:

$ mkdir test-ignore
$ cd test-ignore
$ git init
Initialized empty Git repository in ...
$ echo test ignore rules > README
$ git add README 
$ git commit -m initial
[master (root-commit) 33962fc] initial
 1 file changed, 1 insertion(+)
 create mode 100644 README
$ mkdir -p some/dir/a some/dir/b
$ touch some/dir/file some/dir/a/a.conf some/dir/b/b.conf some/dir/a/ignored
$ cat > some/dir/.gitignore << END
> *
> !*/
> !*.conf
> END
$ git add .
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   some/dir/a/a.conf
        new file:   some/dir/b/b.conf

$ 

解释

  • *表示忽略所有内容(当然,当前未跟踪;跟踪的文件不能被忽略)。
  • */表示如果它是一个目录,不要忽略它,搜索它,并且在文件的后面,这会覆盖以前的条目; 当然,被搜索并不会添加目录中的文件,但会扫描子目录;
  • .* conf表示如果文件的基本名称与*.conf匹配,则不要忽略它,因此some/dir中名为*.conf的任何文件,或some/dir的任何子目录中名为 * 的任何文件*.conf ,不会被忽略,因此会被添加。

这就是为什么some/dir/a/a.conf确实被添加了,但some/dir/a/ignored没有。

(你没有在文本中指定你想对some/dir/somefilesome/dir/thing.conf做什么,所以我在这里应用了相同的规则: file被忽略, thing.conf未被忽略。我认为这就是你想要的.**/* conf 。)

通常,将.gitignore文件“沿树”尽可能地移动会简化它,因此将其放在some/dir/.gitignore中会更容易。 一般规则*/足够接近.gitignore的末尾,强制 Git 不要短路递归找到的子目录的扫描。 除了这两个规则(应该很明显,但起初并不总是很明显)之外,rest 很明显。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM