Git基础05 — 忽略特定文件或目录

内容说明

在 Git 中,可以使用 .gitignore 文件来忽略哪些文件不需要进行跟踪。该文件的内容格式说明:

  • 所有空行不匹配任何文件或目录,仅作为内容的分隔符来方便阅读
  • 以 "#" 开头的行表示注释
  • 每一行都表示一个忽略规则(模式匹配)
  • 冲突的内容可使用 "\" 进行转义。比如以 "#" 开头的行是注释行,若要让 "#" 的含义失效,可使用 "\#"
  • 在忽略时,Git 会将 .gitignore 文件内容从上到下进行读取并依次按照顺序进行匹配
  • .gitignore 文件可以存放在当前项目目录下,也可以存放在项目目录的子目录中,也可以存放在当前用户的家目录中(~/.gitignore),Git 会从多个来源检查忽略规则(模式匹配),这涉及到忽略规则的优先级问题,后面介绍
  • 以 "/" 开头表示作用于当前目录的分隔符,它可以出现在 .gitignore 文件的开头、中间以及结尾。比如我将 .gitignore 存放在项目目录下,则 "/" 就是表示从项目的根开始匹配
  • 以 "/" 结尾表示忽略该目录,结尾没有 "/" 表示既可以匹配文件,也可以匹配目录
  • 要忽略指定模式以外的文件或目录,可以在模式前加上叹号 "!" 取反。使用时请注意!如果文件所在的目录已经被忽略排除了,即使使用 "!" 也不会再次包含
  • "*" 表示匹配除 "/" 以外的任意字符
  • "?" 表示匹配除 "/" 以外的任何单个字符
  • 范围匹配,如 [a-zA-Z] 表示匹配范围内的任意一个字母字符,[1-9] 表示匹配任意一个数字字符。也可以在范围匹配上取反,如 [!a-zA-Z] 表示匹配任意的单个非字母字符
  • "**" 具有特殊含义:

    1. "**" 后跟 "/" 表示匹配所有的目录,例如 "**/foo" 可以匹配任意路径下的 foo 文件或目录,其等同于 "foo"。"**/foo/bar" 匹配位于目录 "foo" 下的 "bar" 文件或目录。
    2. "/**" 表示匹配其中的所有内容。例如 "abc/**" 表示递归匹配 "abc" 目录下的所有内容
    3. "/" 后跟 "**" 和 "/",可匹配 0 个或多个目录。比如 "a/**/b" 表示可以匹配 a/ba/x/ba/x/y/b

有些同学可能会想知道 "abc/*" 和 "abc/**" 的区别,如下表所示:

模式匹配 范围 示例
abc/* 仅匹配 abc 目录的直接子项(非递归) 匹配 abc/file.txt ,但不匹配 abc/subdir/file.txt
abc/** 递归匹配 abc 目录及其所有子目录内容 abc/file.txt 和 abc/subdir/file.txt 均匹配

忽略规则的优先级

由高到低依次是:

  1. 命令行中读取到的可用忽略规则
  2. .gitignore 文件离项目的根目录越远(换个说法,.gitignore 所在的文件路径越深),表示优先级越高。每个 .gitignore 文件仅对自身所在目录及子目录生效,例如根目录的规则可影响整个项目,但子目录的规则会覆盖上级同名规则‌。例如,假设 a 是项目的根目录,有 /tmp/a/.gitignore/tmp/a/dir1/.gitignore/tmp/a/dir2/dir2-1/.gitignore 这样的三个 .gitignore 文件,表示忽略规则的由低到高。
  3. .git/info/exclude 文件
  4. 配置变量 core.excludesFile 的值(~/.gitignore

示例

  1. 忽略所有以 .a 结尾的文件

    *.a
    
    # 或者
    
    **/*.a
  2. 跟踪所有的 lib.a,即便在该行的前面忽略了 .a 文件

    *.a
    
    !lib.a
  3. 只忽略当前目录下的 build 文件,而不忽略子目录的 build 文件(例如 subdir/build)

    /build
  4. 忽略 public 目录

    public/
  5. 忽略 public 目录下的子项内容

    public/*
  6. 忽略 doc/notes.txt 文件,但不忽略 doc/server/arch.txt 文件

    doc/*.txt
  7. 忽略 doc/ 目录下及其所有子目录下的 .pdf 文件

    doc/**/*.pdf
  8. 忽略所有 temp.log 文件

    temp.log
    
    # 或者
    
    **/temp.log
  9. 忽略所有以 img 开头的文件

    img*
    
    # 或者
    
    **/img*
  10. "!" 的注意事项

    这样写入之后,并不会再次包含 access.log 文件,因为该文件所在的目录已经被提前排除了。

    public/
    !public/access.log

    正确的写法:

    public/*
    !public/access.log

GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,你可以在 https://github.com/github/gitignore 找到它。使用者找到适合当前编程语言的 .gitignore 文件并进行适当的修改即可。

注意事项

可使用 git check-ignore -v {File-Name | DIR-Name} 来检查文件或目录是否被忽略掉,若文件或目录被忽略了,则会有输出内容。

一旦特定的文件或目录符合忽略规则,则正常情况下使用 git add 将无法跟踪这些文件或目录,若您确实需要跟踪这些被忽略的文件,可使用 -f 选项:

Shell > git add -f 

.gitignore 只能忽略那些历史过往没有被 Git 追踪过的文件或目录,但若被忽略的文件或目录已经被 Git 跟踪,可执行以下命令:

Shell > git rm -r --cache {File-Name | DIR-Name}

Shell > git add {File-Name | DIR-Name}

Shell > git commit
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇