.gitignore遵循什么模式?

时间:2016-01-20 13:47:19

标签: git shell glob

这是我当前目录的内容。

$ 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中的模式与shell中的相同模式的行为不同。在shell *.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模式的行为不同的位置和原因?

2 个答案:

答案 0 :(得分:10)

gitignoreglob convention

之后使用“*
  

Git将模式视为适合 fnmatch(3) 消费的shell glob,其中 FNM_PATHNAME flag :模式中的通配符不匹配路径名中的/

     

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

OP Lone Learner询问in the comments

  

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

因为那是shell configuration choice

输入(使用shoptspecific to bash):

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

那是使用dotglob

  

如果设置,Bash包含 filename expansion 结果中以“.”开头的文件名。 (对于pattern matching

答案 1 :(得分:3)

.gitignore只包含您希望告知 git不要跟踪的模式的条目(通配符支持)。

此配置存储在文件夹级别 在那里,您可以指定要忽略的文件 此文件将以递归方式应用于内部的所有子文件夹。

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

  • System level - (全局),例如,如果您是unix用户,并且您希望忽略所有项目的*.so个文件,那么您将放置它在全局文件中

  • 本地 - 通常会在项目级别申请指定项目的所有内容。

  • 文件夹 - 给定文件夹的特定定义(例如 - 忽略密码文件,日志文件等或您要忽略的任何其他资源)

还有一个配置属性core.excludesfile,允许您设置要使用的被忽略文件。

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

您还可以通过在文件前添加!来指定哪些文件不要忽略,以便被忽略(请阅读以下有关通配符的详细信息)可以使用的。)

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

  

我无法在页面中找到*匹配零个或多个字符并匹配隐藏文件的内容

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

  

? =匹配给定模式的零次或一次    * =匹配给定模式的零次或多次出现    + =匹配给定模式的一个或多个匹配项    @ =匹配其中一个给定的模式    ! =匹配除了某个给定模式之外的任何内容。

在评论中,您询问了有关*模式的信息。

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

enter image description here

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

enter image description here