gitignore什么意思,*~和其他模式代表什么?

6
我发现了这个 .gitignore 文件,但无法理解其中的内容。特别是第一行*~和第二行。

以下是完整的内容,以供快速参考:

*~
\#*\#
*.swp
tmp/*
private/**/*
public/cache
.DS_Store
.#*
example_presentation.html

请解释一下。除了man页面之外,哪里可以找到gitignore使用的模式的详细语法?
我已经尝试过man页面,但遗憾的是,我发现那里的模式描述不够有用。因此提出问题。

第一行忽略以波浪号(~)结尾的任何内容,第二行忽略以\#开头或结尾的任何内容。双星号(**)表示匹配所有目录,换句话说,忽略所有目录/子目录中匹配的任何内容。 - Jonny Henly
3个回答

7

有两类表达式需要放在 .gitignore 文件中:匹配临时文件、备份文件或开发工具使用的文件的表达式和匹配项目文件的表达式。

第一类匹配不需要项目的文件,因为它们是由工具生成的,要么是为了它们自己的使用,要么是作为修改文件的备份。

第二类匹配项目需要的文件,但它们可能是由项目代码生成的,或者是包含敏感信息(如密码)和依赖于项目运行的计算机的配置设置的配置文件。

您发布的模式:

  1. 备份、临时文件等:

    • *~ - 文件名以 ~ 结尾,由某些 OSX 和 Linux 编辑器创建为备份副本;Windows 软件通常会将文件扩展名替换为 .bak (或附加到文件名末尾);
    • \#*\# - 引用自 .gitignore 的文档"以 # 开头的行作为注释。对于以 # 开头的模式,在第一个哈希前放置反斜杠("\")即可." -- 这意味着第二个 # 不需要转义。

      我不知道哪个软件会生成文件名以 # 开头和结尾的文件,但很可能它们是临时文件;

    • *.swp - 由 vi 使用的临时文件,用于检测编辑器的两个实例对同一文件的同时编辑;
    • .DS_Store - 在每个目录中由 OSX Finder 创建的文件;它们包含了其内部的簿记信息(缩略图、排序顺序等);
    • .#* - 文件名以 .# 开头的文件;Emacs 使用 .#* 作为锁文件以检测同时编辑(感谢 @TobySpeight);无需转义 #,请参见上文;
  2. 项目中使用但不需要存储在版本库中的文件:

    • tmp/* - 许多 Web 应用程序在名为 tmpvar/tmp 等目录中生成临时文件;
    • public/cache - public 目录是通过 Web 服务器可见的项目部分;cache 子目录可能包含生成的文件(例如合并和压缩脚本和 CSS 文件)- 它们需要在运行时外部可见(公共),但不需要存储在版本库中,因为它们是生成的;
    • private/**/*example_presentation.html - 这两个过于具体化;只有您的项目能够解释为什么版本库应该忽略它们。

只是好奇:我想在.gitignore中,#符号必须被转义,这就解释了\#*\#。但为什么在.#*中没有被转义呢?可能是打字错误吗?也许只有以开头的行需要转义,但那么为什么\#*\#不是\#*#呢? - Jonny Henly
Emacs使用.#*作为锁文件来检测同时编辑。 - Toby Speight
1
@TobySpeight 谢谢。我从来没有用过emacs;事实上,我尝试了好几次,但每次都回到了vi :-) - axiac
1
@JonnyHenly 我刚刚更新了答案,并引用了.gitignore文档中的一句话。看起来第一个模式应该是\#*#,而第二个模式(.#*)不需要转义。感谢您的评论;我之前并不知道在.gitignore中如何使用注释和转义符号#的确切规则,但现在我已经明白了。 :-) - axiac
私有/**/* 对我来说似乎有点奇怪。为什么要用 ** ?我猜这将匹配 private/something/other,但不匹配 private/other(因为 / 被计算为字符)?更新:刚看到上面关于双星号的定义(在 OP 的评论中),但仍不确定它的含义是什么... - Ashley Aitken
1
@AshleyAitken 在 .gitignore 的文档中有解释:"在与完整路径名匹配的模式中,两个连续的星号("**")可能具有特殊含义:(阅读更多)"。 - axiac

1

这些模式是标准的 glob 模式;请参阅 glob(7) 手册页面:

一个?(不在方括号内)匹配任何单个字符。 一个*(不在方括号内)匹配任何字符串,包括空字符串。 表达式[...]中,在前导[后的第一个字符不是!时,匹配单个字符,即括号内包含的任何字符。括号括起来的字符串不能是空的;因此,如果]是第一个字符,则可以在括号之间允许它。(因此,[][!]匹配三个字符[]!。) 有一个特殊的约定:用-分隔的两个字符表示一个范围。(因此,[A-Fa-f0-9]等同于[ABCDEFabcdef0123456789]。)可以通过将其作为括号之间的第一个或最后一个字符来使-具有其字面意义。(因此,[]-]仅匹配两个字符]-,而[--0]匹配三个字符-.0,因为/无法匹配。) 表达式[!...]匹配单个字符,即不与从中删除第一个!得到的表达式匹配的任何字符。(因此,[!]a-]匹配除]a-之外的任何单个字符。) 可以通过在它们之前加上反斜杠来去除?*[的特殊含义。在方括号之间,这些字符代表它们自己。因此,[[?*\]匹配四个字符[?*\

0

*~ 匹配以 ~ 结尾的任何文件名。一些文本编辑器会创建以 ~ 结尾的文件作为自动保存备份。忽略这些文件是有意义的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接