在使用Git的过程中,有些文件比如说日志、临时文件、编译的中间文件文件等不需要提交到Git仓库,这个时候需要设置对应的忽略规则,来忽略这些文件的提交。使用场景:比如说在使用git add .命令的时候不小心把不想提交的文件添加到缓存中去了,虽然可以使用git reset HEAD example.txt ,又或者是使用git add 具体文件的方式来避免将不想要提交的文件添加到暂存区,但是这样终归没有直接使用git add .方便,这个时候就可以使用Git为我们提供.gitignore文件,只要在文件中申明哪些文件不需要添加到暂存区,然后在使用git add .命令的时候就不会被添加到暂存区了。
实现在Git中忽略不想提交的文件
- 直接在项目中定义.gitignore文件,然后在.gitignore文件中定义要忽略的文件
- 在Git项目的设置中指定忽略文件,在
.git/info/exclude文件中写入要忽略的文件 - 定义Git全局的.gitignore文件,使用命令如下
git config --global core.excludesfile ~/.gitignore
.gitignore忽略规则的优先级
由高到低的优先级如下:
- 从命令行中读取可用的忽略规则
- 当前目录定义的规则
- 父级目录定义的规则,依次递推
- $GIT_DIR/info/exclude 文件中定义的规则
- core.excludesfile中定义的全局规则
.gitignore的匹配语法
- 空行:空行将被忽略。
- 以
#开头的表示为注释。 - 斜杠
/:如果斜杠出现在行首,表示只匹配项目根目录;如果斜杠出现在其他位置,表示匹配任意位置。 !:感叹号用于取反,即排除某些匹配的文件或目录。*:星号匹配零个或多个字符。?:问号匹配一个字符。**:双星号匹配任意子目录。/dir/:表示忽略根目录下的dir目录。dir/:表示忽略任意位置的dir目录。/*.txt:表示只匹配根目录下的.txt文件。debug.log:表示忽略任意位置的debug.log文件。**/logs/:表示匹配所有子目录中的logs目录。*.log:表示匹配所有以.log结尾的文件。assets/:表示匹配名为assets的目录。build:表示匹配名为build的文件或目录。build/:表示只匹配名为build的目录。
gitignore该开源项目收集了所有可用的.gitignore模板
Java .gitignore template
| |
.gitignore配置不生效原因和解决
在Git中,即使在.gitignore中标明了要忽略的文件或目录,但如果这些文件已经被纳入版本管理,依然会出现在git push的目录中,并且在使用git status查看状态时仍然显示为被追踪的文件。这是因为Git会缓存已经纳入版本管理的文件,即使在.gitignore中声明了忽略路径也不会生效。
要解决这个问题,需要先将本地缓存删除,然后再进行提交操作。这样就可以确保被声明为忽略的文件不会被提交到版本库中,也不会出现在推送的目录中。 解决方法: git清除本地缓存(改变成未track状态),然后再提交:
| |
或者在clone的时候手动设置不要检查特定文件的更改情况:git update-index --assume-unchanged PATH
需要注意的点:
.gitignore只能忽略原来没有被track的文件,如果文件已经被纳入了版本库中,则修改.gitignore是无效的。想要.gitignore起作用,必须要在这些文件不在暂存区中才可以,.gitignore文件只是忽略没有被staged(cached)文件,对于已经被staged文件,加入ignore文件时一定要先从staged移除,才可以忽略。