[TOC]
git忽略文件的方式
1. .gitignore
文件(整个仓库都忽略)
文件指定了 Git 追踪时应忽略的文件。在文件里配置忽略规则,同时把 .gitignore
文件加入版本管理。
文件 .gitignore
的格式规范如下:
- 所有空行或者以
#
开头的行都会被 Git 忽略。 - 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(
/
)开头防止递归。 - 匹配模式可以以(
/
)结尾指定目录。 - 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(
!
)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*
)匹配零个或多个任意字符;[abc]
匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); 问号(?
)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9]
表示匹配所有 0 到 9 的数字)。 使用两个星号(**
)表示匹配任意中间目录,比如 a/**/z
可以匹配 a/z
、 a/b/z
或 a/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
文件。)
参考:
2. 本机开发忽略.git/info/exclude
单个仓库下忽略,不会同步该设置至远程仓库,只在本机起作用;配置方法是直接编辑仓库根目录下的.git/info/exclude
文件,把要忽略的规则直接写入。文件内容规则跟.gitignore
文件一样
3. 忽略已跟踪文件改动 assume-unchanged、skip-worktree
对于已经提交、跟踪的文件,如果想要忽略修改的记录。可以使用assume-unchanged和skip-worktree命令。让git认为这个文件没有修改。如果想要git从新追踪这个文件,则需要使用命令从新标记。
添加本地忽略
git update-index --assume-unchanged 【文件路径】 git update-index --skip-worktree 【文件路径】
移除本地忽略(恢复跟踪)
git update-index --no-assume-unchanged vue.config.js git update-index --no-skip-worktree vue.config.js
可以使用
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
两个参数的区别:
- 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