『现学现忘』Git基础 — 20、Git中忽略文件补充
1、忽略文件常遇到的问题
有些时候,你想添加一个文件到Git,但发现添加不了,原因可能是这个文件被.gitignore
忽略了:
$ git add App.class
The following paths are ignored by one of your .gitignore files:
App.class
Use -f if you really want to add them.
如果你确实想添加该文件,可以用-f
参数强制添加到Git本地版本库:
关于-f
参数,描述如下:
-f, --force
:Allow adding otherwise ignored files.
允许添加被忽略的文件。
$ git add -f App.class
或者你发现,可能是.gitignore
写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore
命令检查:
$ git check-ignore -v App.class
.gitignore:3:*.class App.class
Git会告诉我们,.gitignore
的第3行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。
还有些时候,当我们编写了规则排除了部分文件时:
# 排除所有.开头的隐藏文件:
.*
# 排除所有.class文件:
*.class
但是我们发现.*
这个规则把.gitignore
也排除了,并且App.class
需要被添加到版本库,但是被*.class
规则排除了。
虽然可以用git add -f
强制添加进去,但有强迫症的童鞋还是希望不要破坏.gitignore
规则,这个时候,可以添加两条例外规则:
# 排除所有.开头的隐藏文件:
.*
# 排除所有.class文件:
*.class
# 不排除.gitignore和App.class:
!.gitignore
!App.class
把指定文件排除在.gitignore
规则外的写法就是!
+文件名,所以,只需把例外文件添加进去即可。
小结
- 忽略某些文件时,需要编写
.gitignore
文件。 .gitignore
文件本身要放到版本库里,并且可以对.gitignore
做版本管理。- 可以不提交到本地版本库或远程仓库,只对本地副本有效。
- 可以提交到远程仓库,对所有
clone
下来的版本库生效。(所以个人特殊忽略不要在这里添加)
2、忽略文件配置优先级
Git检查忽略规则的时候有多个来源,它的优先级如下(由高到低):
- 从命令行中读取可用的忽略规则。
- 当前目录定义的规则(
.gitingore
文件)。 - 父级目录定义的规则,依次递推,目录结构较高的
.gitignore
文件将被较近的.gitignore
文件中相同的配置所覆盖(.gitingore
文件)。 .git/info/exclude
文件中定义的规则。core.excludesfile
中定义的全局规则。
3、忽略已跟踪文件的改动(本机使用)
(1)需求说明
之前的忽略方案,都是适用于未跟踪文件的忽略,而对于已跟踪(track
)文件的改动并不适用,好在针对这种情况,Git也提供了我们方法去忽略。
换句话说,就是添加忽略之后,修改已经提交到版本库中的文件是无法忽略的。
即:
.gitignore
只能忽略那些原来没有被track
的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore
是无效的。
(2)处理步骤
自己思考的方式:(稀烂哈哈)
- 将项目
clone
到本地。 - 删除项目中的忽略配置,如:根目录中的
.gitignore
文件。 - 然后在创建新的
.gitignore
文件,重新配置忽略。
正确的做法:
clone
下来的仓库中手动设置,不要检查特定文件的更改情况。
执行命令如下:# 忽略跟踪(提交代码时,忽略某一个文件不提交,即某个文件不被版本控制)
# file-path是目标文件路径
git update-index --assume-unchanged file-path # 恢复跟踪
git update-index --no-assume-unchanged file-path
这样已经在本地版本库中的文件修改之后,也可以被忽略。
不过如果执行git checkout
(切换分支)和git reset
(回退版本)命令的时候仍然会影响到这些文件,并把内容恢复到被跟踪的内容(再次执行上面命令,修改仍然不会被跟踪)。- 另一种方式:
Git还提供了另一种exclude
的方式来做同样的事情,就是之前说过的在本地版本库中的.git/info/exclude
文件中配置忽略,这里设置的忽略规则是你自己本地需要排除的文件, 他不会影响到其他人,也不会提交到版本库中去。
4、autocrlf和safecrlf参数说明
(1)提出问题
我们在配置全局忽略.gitconfig
文件的时候,可能会看到如下配置:
[core]
autocrlf = true
safecrlf = false
excludesfile = C:/Users/L/gitignore_global.txt
那么autocrlf = true
和safecrlf = false
是什么意思?
LF
是Linux系统下的换行符,而CRLF
是Windows系统下的换行符。由于我们的文件创建于Linux系统下(Git Bash中创建),而保存中Windows系统中,所以文件中的行结束符,要使用Windows下的CRLF
格式换行,而在Git中的默认配置是自动转换。
因为在Git的忽略文件中,是一行一行的忽略规则,而autocrlf
和safecrlf
就是对转变换行格式的具体配置。
(2)autocrlf说明
autocrlf = true
:表示要求Git在提交时将CRLF
转换为LF
,而在检出时将LF
转换为CRLF
。autocrlf = false
:在提交与检出代码的时候均不对换行符进行转换。autocrlf = input
:表示在提交时将CRLF
转换为LF
,而检出时不转换。
以上可手动配置在.gitconfig
文件中,
使用命令行配置如下:
# 提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf true
# 提交时转换为LF,检出时不转换
git config --global core.autocrlf input
# 提交检出均不转换换行格式
git config --global core.autocrlf false
提示:当
git add
遇到fatal: LF would be replaced by CRLF
或者fatal: CRLF would be replaced by LF
的错误时,我们就需要考虑autocrlf
参数的配置了。
建议:
Windows:(true)
提交时,将
CRLF
转成LF
再提交。切出时,自动将
LF
转为CRLF
。MAC/Linux: (input)
提交时, 将
CRLF
转成LF
再提交。切出时,保持
LF
即可。
这样即可保证仓库中永远都是LF
, 而且在Windows工作空间都是CRLF
,在Mac/Linux工作空间都是LF
。
(3)safecrlf说明
autocrlf = ture
:拒绝提交包含混合换行符的文件。autocrlf = false
:允许提交包含混合换行符的文件。autocrlf = warn
:提交包含混合换行符的文件时给出警告。
以上可手动配置在.gitconfig
文件中,
使用命令行配置如下:
# 拒绝提交包含混合换行符的文件
git config --global core.safecrlf true
# 允许提交包含混合换行符的文件
git config --global core.safecrlf false
# 提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn
参考:
『现学现忘』Git基础 — 20、Git中忽略文件补充的更多相关文章
- 『现学现忘』Git基础 — 14、Git基础操作的总结与补充
目录 1.Git本地版本库结构 2.Git常用操作方法 3.补充:添加多个文件到暂存区 4.补充:提交操作未写备注 5.补充:从工作区直接提交到版本库 1.Git本地版本库结构 如下图所示: 工作区( ...
- 『现学现忘』Git基础 — 37、标签tag(二)
目录 5.共享标签 6.删除标签 7.修改标签指定提交的代码 8.标签在.git目录中的位置 9.本文中所使用到的命令 提示:接上一篇文章内容. 5.共享标签 默认情况下,git push 命令并不会 ...
- 『现学现忘』Git基础 — 5、Git的协作模式
目录 1.分布式工作流程 2.集中式工作流 3.分支工作流 4.GitFlow 工作流(最流行) 5.Forking 工作流(偶尔使用) 6.总结 1.分布式工作流程 与传统的集中式版本控制系统(CV ...
- 『现学现忘』Git基础 — 13、Git的基础操作
目录 1.Git最基础的使用方式 (1)初始化本地版本库 (2)查看文件的状态 (3)把文件添加到暂存区 (4)把暂存区的内容提交到本地版本库 2.总结本文用到的Git命令 1.Git最基础的使用方式 ...
- 『现学现忘』Git基础 — 18、Git对象的总结
目录 1.Git操作最基本的流程 2.工作目录中文件的状态 3.Git效率说明 提示:前面三篇文章已经分别的对blob对象.tree对象.commit对象进行了详细的说明,这篇文章我们总结一下,Git ...
- 『现学现忘』Git基础 — 21、git diff命令
目录 1.git diff 命令说明 2.比较工作区与暂存区中文件的差别 3.比较暂存区与本地库中文件的差别 4.总结git diff命令常见用法 5.总结 1.git diff 命令说明 在comm ...
- 『现学现忘』Git基础 — 22、Git中文件重命名
目录 1.用学过的命令进行文件重命名 2.使用git mv命令进行文件重命名 我们这篇文章来说说在Git中如何进行文件重命名. 提示一下,下面所说明的是对已经被Git管理的文件进行重命名,未被Git追 ...
- 『现学现忘』Git基础 — 2、Git和SVN的区别
1.Git和SVN的区别 (1)SVN(集中式版本管理系统) 集中式的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者 ...
- 『现学现忘』Git基础 — 3、Git介绍
目录 1.Git的历史 2.Git的特点 3.Git在项目协作开发中所解决的问题 1.Git的历史 Git是目前世界上最先进的分布式版本控制系统,开源.免费. Git 是 Linus (林纳斯)为了帮 ...
随机推荐
- 访问修饰符 public,private,protected,以及不写(默认) 时的区别?
修饰符 当前类 同 包 子 类 其他包 public √ √ √ √ protecte d √ √ √ × default √ √ × × private √ × × × 类的成员不写访问修饰时默认为 ...
- Dubbo 推荐用什么协议?
dubbo://(推荐) rmi:// hessian:// http:// webservice:// thrift:// memcached:// redis:// rest://
- spring DAO 有什么用?
Spring DAO 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一 种统一的方式工作.这使得用户容易在持久性技术之间切换.它还允许您在编写 代码时,无需考虑捕获每种技术 ...
- GC日志浅析
//java 开发环境,使用HotSpot的虚拟机,64位,windows 开发环境 Java HotSpot(TM) 64-Bit Server VM (25.151-b12) for window ...
- MyBatis Plus 2.3 个人笔记-01-代码生成器
sb_mybatis_puls2.3 <?xml version="1.0" encoding="UTF-8"?> <project xmln ...
- 【代码开源】GreaterWMS 抖音SDK调用教程
应用介绍 GreaterWMS 抖音SDK调用教程 SDK具体功能: 1,一仓多店,多仓多店 2,库存同步,商品同步 3,快递发货,物流轨迹 4,订单拦截 5,字节云仓 6,精选联盟 7,供应分销 8 ...
- js技术之循环for
案例:把所有单词以空格为分割并将首字母转为大写 <!DOCTYPE html><html lang="en"><head> <meta c ...
- 机器学习 machine learn
机器学习 机器学习 概述 什么是机器学习 机器学习是一门能够让编程计算机从数据中学习的计算机科学.一个计算机程序在完成任务T之后,获得经验E,其表现效果为P,如果任务T的性能表现,也就是用以衡量的P, ...
- (stm32f103学习总结)—GPIO结构
一.GPIO基本结构 二.GPIO工作模式 输入模式 输入浮空 输入上拉 输入下拉 模拟输入 输出模式 开漏输出 开漏复用功能 推挽式输出 推挽式复用功能 库函数中所对应的代码 1 typedef e ...
- 一整套PCB设计流程和要点,老板再也不怕我出错!
资料输入阶段 1. 在流程上接收到的资料是否齐全(包括:原理图.*.brd文件.料单.PCB设计说明以及PCB设计或更改要求.标准化要求说明.工艺设计说明文件) 2. 确认PCB模板是最新的 3. 确 ...