gitignore pattern format

网上虽然能搜到很多讲解 gitignore 模式匹配格式的博客,但它们大都不全或者不太清楚,要彻底搞明白还得直接看官方文档啊!

PATTERN FORMAT

翻译自:https://git-scm.com/docs/gitignore PATTERN FORMAT 一节。

  • 空行不匹配任何文件,因此可以用空行增加可读性。

  • # 开头的一行是注释,用 \ 进行转义。

  • 末尾的空格将被忽略,除非在空格前用 \ 转义。

  • 可选前缀 ! 表示否定,若匹配的文件被之前的模式忽略了,则它将被重新包含回来;

    但是,如果某文件的父目录被忽略了,则不能重新包含该文件,这是因为 git 出于性能的考虑不会检索被忽略的目录下的文件;

    \ 进行转义。

  • / 用作目录的分隔符,可能出现在模式串的开头、中间或结尾。

    • / 出现在模式串开头或中间(或两者皆有),则模式串匹配相对.gitignore 所在位置的路径;否则模式串将匹配 .gitignore 位置以下的任何层级。
    • / 出现在模式串的结尾,则模式串只会匹配目录;否则模式串既会匹配目录,也会匹配文件。
    • 举个例子,模式串 doc/frotz/ 匹配 doc/frotz 目录,但不匹配 a/doc/frotz 目录;然而模式串 frotz/ 会匹配 frotza/frotz 目录。
  • 一个星号 * 匹配除了 / 以外的任意字符串;一个问号 ? 匹配除了 / 以外的任意单个字符;区间表示,如 [a-zA-Z],可以用于匹配任何一个区间范围内的字符。

  • 两个星号 ** 匹配完整路径名,有一些特殊含义:

    • ** 开头并紧接一个 / 表示在任何目录下匹配。例如 **/foo 将匹配任意位置的 foo 文件或目录,与 foo 模式串效果相同;**/foo/bar 匹配任何在某 foo 目录下的 bar 文件或目录。
    • /** 结尾表示匹配目录下的任何东西。例如 abc/** 匹配所有在 abc 目录(相对于 .gitignore)下的任何文件,不限目录深度
    • /**/ 表示匹配 0 个或多个目录层级。例如 a/**/b 能匹配 a/ba/x/ba/x/y/b 等等。
    • 其他连续两个星号的用法将被视为一个星号的用法。

常见用法

有了上一节的原理支撑,一些常见的需求就能顺手写出了。

  • 忽略项目中所有 .DS_Store 文件(mac 用户表示很赞)

    1
    .DS_Store
  • 忽略项目中所有 ckpt 目录(不把训练时保存的 checkpoint 加入 git)

    1
    ckpt/

    同理,常用于忽略 __pycache__ 目录、.idea 目录等配置性目录。

  • 忽略 /data/ 目录(不把数据集加入 git)

    1
    /data/
  • 忽略目录 foo 下所有的 model.pt(训练好的模型太大了,不适于放入 git)

    1
    /foo/**/model.pt

gitignore pattern format
https://xyfjason.github.io/blog-main/2022/02/11/gitignore-pattern-format/
作者
xyfJASON
发布于
2022年2月11日
许可协议