2016-01-20 87 views
13

这是我当前目录的内容。.gitignore遵循什么模式?

$ ls 
foo.foo 
$ ls -a 
. .. .bar.foo .foo foo.foo .gitignore 

然后我把这个目录变成一个git仓库。

$ git init 
Initialized empty Git repository in /home/lone/foo/.git/ 
$ ls -a 
. .. .bar.foo .foo foo.foo .git .gitignore 

这里是.gitignore的内容。

$ cat .gitignore 
*.foo 

我看到,在.gitignore模式从外壳相同的模式不同的行为方式。在外壳*.foo只匹配非隐藏文件,即不以句点开头的文件名。

$ echo *.foo 
foo.foo 

*.foo.gitignore似乎匹配任何文件,隐藏或不隐藏,与.foo结束。

$ git status 
On branch master 

Initial commit 

Untracked files: 
    (use "git add <file>..." to include in what will be committed) 

     .gitignore 

nothing added to commit but untracked files present (use "git add" to track) 

我在哪里可以了解更多有关的.gitignore遵循模式的准确定义,所以我能理解为什么它的行为不同于shell glob模式的不同?

+3

这是一个资源:https://git-scm.com/docs/gitignore。在某些情况下,它的处理方式与壳体水珠完全相同。 “否则,Git的对待方式看作是适合于消费的fnmatch壳水珠(3)与FNM_PATHNAME标志”(但读它上面的东西,因为当它没有) – hiandbaii

+0

@hiandbaii我没有问这个问题之前阅读该文档。但是,有几件事我不清楚。 shell是否也使用'fnmatch(3)'来处理glob模式?在那种情况下,为什么'*'在'.'(即隐藏文件)之前不匹配零个字符,但gitignore呢?我无法找到解释这个问题的'gitignore'文档中的精确部分。 –

回答

9

gitignore利用 '*' 紧跟在glob convention

GIT中与FNM_PATHNAME flag通过fnmatch(3)对待图案作为适于食用的壳水珠:通配符在图案将不匹配路径名中的/

例如,“Documentation/*.html”与“Documentation/git.html”匹配,但不匹配“Documentation/ppc/ppc.html”或“tools/perf/Documentation/perf.html”。

OP Lone Learnerin the comments

是否外壳也使用fnmatch(3)处理glob模式?
在这种情况下,为什么*之前不匹配零个字符。 (即隐藏文件),但gitignore呢?

因为那是一个shell configuration choice。 (使用shopt,这是specific to bash

类型:

shopt -s dotglob 
echo *.foo 
.foo foo.foo 

即使用dotglob

如果置位,击包括文件名中的filename expansion结果以 '.' 开始。 (对于pattern matching

3

.gitignore只包含您要格局条目告诉混帐不跟踪(通配符支持)。

此配置存储在文件夹级别。
在那里你可以指定要忽略哪个文件。
该文件将以递归方式应用于所有子文件夹。

.gitignore以交换的方式收集信息:

  • System level - (全球)例如,如果你是一个UNIX用户,你希望忽略所有*.so文件,所有的项目你会将其置于全局文件中

  • 本地 - 通常将在项目级别上应用给定项目的所有内容。

  • 文件夹 - 对指定文件夹的具体定义(例如 - 忽略密码文件,日志文件等,或您希望忽略任何其他资源)

还有一个配置属性core.excludesfile它允许你设置一个被忽略的文件来使用。

git config --global core.excludesfile ~/.gitignore

您还可以指定哪些文件不是由文件之前添加!忽略这样就不会被忽略(阅读更多低于whic可以使用通配符)。

要了解可以阅读的语法here
你可以使用第三方工具为你生成这个文件gitignore.io


我找不到什么在主页上解释说*匹配零个或多个字符匹配和隐藏文件也

文件中的每一行可以包含具有以下通配符的任何模式:

? =匹配零或一个发生给定的图案。
* =匹配零个或多个出现的给定模式。
+ =匹配一个或多个出现的给定模式。
@ =匹配给定模式之一。
! =匹配除给定模式之外的任何内容。


在您的评论你问有关*模式信息。

在这里您可以看到*忽略所有文件。 Git不关心它是否隐藏文件。它只是寻找匹配的模式。

enter image description here

如上解释的git尝试匹配您在.gitignore文件中提供的模式,所以如果你希望忽略在内部夹中的文件,你必须指定内部文件夹。以下是文件夹内容演示以及如何忽略内部文件。您可以看到内部文件夹aa包含内部文件,但由于忽略文件包含**/模式,因此它将忽略所有内部文件夹和文件。

enter image description here

+0

在问这个问题之前,我确实已经阅读过这个文档。我无法在页面中找到解释“*”匹配零个或多个字符并匹配隐藏文件的内容。 –

+0

添加了有关通配符星号的更多详细信息。随意问,如果事情还不清楚 – CodeWizard

+1

根据经验混帐的规则嗅探出在给定的文件夹结构中的所有文件(Linux或Windows),并会在默认情况下包括它们的源代码控制之下,除非他们是在明确的.gitignore忽略。在这种情况下,该规则将适用于隐藏和可见文件夹。然后因为*匹配零个或多个字符...我个人没有看过git的规格或所有文件,但我觉得有些东西可以从底层文件系统的行为,特别是在Linux上进行推断。 – Eniola