【问题标题】:What's the difference between Git ignoring directory and directory/*?Git忽略目录和目录/ *有什么区别?
【发布时间】:2014-11-01 04:18:08
【问题描述】:

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

假设我有以下目录结构:

my_project  
     |--www  
         |--1.txt  
         |--2.txt
     |--.gitignore

放这个有什么区别:

www

还有这个?

www/*

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

www
!*.gitkeep

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

www/* 
!*.gitkeep

然后就可以了!所以我认为这两种方法之间一定存在一些差异。

【问题讨论】:

  • bin 和bin/ 之间的一个简单区别是前者会忽略文件或文件夹,后者只会忽略文件夹。我不知道与bin/*的区别

标签: git gitignore notation dotfiles


【解决方案1】:

www、www/ 和 www/* 之间存在差异。

基本上从documentation和我自己的测试来看,www找一个文件或者目录匹配,www/只匹配一个目录,而www/*匹配www里面的目录和文件.

这里只讨论www/和www/*之间的区别,因为www和www/之间的区别是显而易见的。

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

例如,如果我们只想包含 www/1.txt 而忽略 www 中的所有其他内容,该怎么办?

下面的.gitignore 不起作用。

www/
!www/1.txt

虽然以下.gitignore 有效,但为什么?

www/*
!www/1.txt

对于前者,git 只是忽略了目录www,甚至不会再往里看以包含www/1.txt。第一条规则排除了父目录www 但不排除www/1.txt,因此www/1.txt 不能“再次包含”。

但对于后者,git 首先会忽略www 下的所有文件/文件夹,然后再次包含其中一个,即www/1.txt。

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

可选前缀“!”这否定了模式;任何匹配的文件 被先前的模式排除将再次被包含。它不是 如果该文件的父目录是,则可以重新包含该文件 排除在外。

【讨论】:

  • 你不认为www/1.txt 然后www/ 会和第二种方法一样......
【解决方案2】:

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

$ cat .gitignore
    # exclude everything except directory foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar

我确实测试了上述内容,如果将!/foo 替换为!/foo/*,确实会得到不同的结果。

注意

foo

将排除任何文件foo,但是

foo/

只会排除名为 foo 的目录。

【讨论】:

    【解决方案3】:

    除了您已经获得的完美答案之外,您应该注意,您可以在项目中的任何位置使用.gitignore,包括子文件夹。

    因此,如果您想忽略 www 中的所有文件,但希望对 www 文件夹进行版本控制,而不是使用空的 .gitkeep、.dummy 或您选择的任何名称,为什么不使用 @ 987654326@那里,告诉忽略所有文件?

    /
    |- .gitignore   (a)
    \- www
        |- .gitignore   (b)
        |- 1.jpg
        \- 2.jpg
    

    在根.gitignore (a) 中,您没有提及www 文件夹或其内容。

    在www/.gitignore (b) 中输入以下内容:

    # ignore all files in this folder except this .gitignore
    *
    !.gitignore
    

    这样一来,一切看起来更有条理(至少对我而言)。

    【讨论】:

      【解决方案4】:

      要忽略目录中除点文件之外的所有内容,您可以在 .gitignore 中使用以下全局模式:

      www/[^.]*
      

      因此无需额外的.gitignore,只需将.keep 文件添加到您的www 目录即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-21
        • 2012-03-17
        相关资源
        最近更新 更多