[TOC]

git忽略文件的方式

1. .gitignore 文件(整个仓库都忽略)

文件指定了 Git 追踪时应忽略的文件。在文件里配置忽略规则,同时把 .gitignore 文件加入版本管理。

文件 .gitignore 的格式规范如下:

  • 所有空行或者以 # 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
  • 匹配模式可以以(/)开头防止递归。
  • 匹配模式可以以(/)结尾指定目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); 问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号(**)表示匹配任意中间目录,比如 a/**/z 可以匹配 a/za/b/za/b/c/z 等。

一个 .gitignore 文件的例子:

# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf

注意
1、GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表, 你可以在 https://github.com/github/gitignore 找到它。
2、在最简单的情况下,一个仓库可能只根目录下有一个 .gitignore 文件,它递归地应用到整个仓库中。 然而,子目录下也可以有额外的 .gitignore 文件。子目录中的 .gitignore 文件中的规则只作用于它所在的目录中。 (Linux 内核的源码库拥有 206 个 .gitignore 文件。)

参考:

Git 基础 - 记录每次更新到仓库

gitignore说明

2. 本机开发忽略.git/info/exclude

单个仓库下忽略,不会同步该设置至远程仓库,只在本机起作用;配置方法是直接编辑仓库根目录下的.git/info/exclude文件,把要忽略的规则直接写入。文件内容规则跟.gitignore文件一样

3. 忽略已跟踪文件改动 assume-unchanged、skip-worktree

git update-index 说明文档

对于已经提交、跟踪的文件,如果想要忽略修改的记录。可以使用assume-unchanged和skip-worktree命令。让git认为这个文件没有修改。如果想要git从新追踪这个文件,则需要使用命令从新标记。

  1. 添加本地忽略

    git update-index --assume-unchanged 【文件路径】
    git update-index --skip-worktree 【文件路径】
    
  2. 移除本地忽略(恢复跟踪)

    git update-index --no-assume-unchanged vue.config.js
    git update-index --no-skip-worktree vue.config.js
    
  3. 可以使用git ls-files -v查看所有文件列表,小写h开头是assume-unchanged 标记的文件,大写S是skip-worktree标记的文件。

    # 查看 assume-unchanged 命令 忽略的文件
    git ls-files -v | grep '^h\ '
    # 显示文件路径
    git ls-files -v | grep '^h\ ' | awk '{print $2}'
    # 所有被忽略的文件,取消忽略
    git ls-files -v | grep '^h' | awk '{print $2}' |xargs git update-index --no-assume-unchanged  
    
    # 查看 skip-worktree 命令 忽略的文件
    git ls-files -v | grep '^S'
    # 显示文件路径
    git ls-files -v | grep '^S' | awk '{print $2}'
    # 所有被忽略的文件,取消忽略
    git ls-files -v | grep '^S' | awk '{print $2}' |xargs git update-index --no-skip-worktree
    
  4. 两个参数的区别:

    • assume-unchanged:这个会关闭文件与远程仓库的跟踪,认为这个文件远程仓库是不会修改,所以每次pull都是本地的文件。
    • skip-worktree:这个不会关闭文件与远程仓库的跟踪,只是告诉Git不要跟踪对本地文件的更改,每次pull时会拉取最新的变化会提示冲突,但因为没有跟踪本地更改,所以需要使用--no-skip-worktree命令后再操作。

4. 各种忽略文件的方法对比

  • .gitignore
    • 说明:显式地阻止提交文件。
    • 优势:.gitignore 文件本身提交至远程仓库,全组共享忽略文件配置。
    • 局限:如果项目已经存在远程仓库,即使被加入 .gitignore,仍然可以进行修改并提交。本地的修改会显示在 git status 结果中。
  • .git/info/exclude
    • 说明:显式地阻止提交文件。
    • 优势:exclude 文件本身不会提交至远程仓库,因此适合放一些个人定制的 「gitignore」 项目。
    • 局限:和 .gitignore 存在同样地局限。文件若已存在远程仓库,则本地修改仍可以提交至远程仓库。本地的修改会显示在 git status 结果中。
  • assume-unchanged
    • 说明:声明本地远程都不会修改这个文件。
    • 优势:git 直接跳过这些文件的处理以提升性能。文件不会出现在 git status
    • 局限:不适合本地或远程需要修改的文件。本地会忽略掉之后远程文件的修改。
  • skip-worktree
    • 说明:声明忽略文件的本地修改。
    • 优势:本地可以对文件做一些个人定制。文件不会出现在 git status
    • 局限:拉取远程文件更新,或切换分支时有可能出现冲突,需要撤销忽略后手动解决冲突。

5. 本机全局忽略(不常用)

忽略规则由本机所有仓库共用,配置方法如下: 编辑 ~/.gitconfig 文件(excludesfile 标记):

[gui]
    encoding = utf-8
[core]
   excludesfile = ~/.gitignore

也可以通过命令行来添加配置:

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

6. 参考资料

Git 小技巧 - 忽略不想要提交的本地修改

git 忽略文件的四种方式

git本地忽略assume-unchanged和skip-worktree

powered by Gitbook文件最后修改时间: 2025-01-07 16:07:17

results matching ""

    No results matching ""