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, --forceAllow 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检查忽略规则的时候有多个来源,它的优先级如下(由高到低):

  1. 从命令行中读取可用的忽略规则。
  2. 当前目录定义的规则(.gitingore文件)。
  3. 父级目录定义的规则,依次递推,目录结构较高的.gitignore文件将被较近的.gitignore文件中相同的配置所覆盖(.gitingore文件)。
  4. .git/info/exclude文件中定义的规则。
  5. core.excludesfile中定义的全局规则。

3、忽略已跟踪文件的改动(本机使用)

(1)需求说明

之前的忽略方案,都是适用于未跟踪文件的忽略,而对于已跟踪(track)文件的改动并不适用,好在针对这种情况,Git也提供了我们方法去忽略。

换句话说,就是添加忽略之后,修改已经提交到版本库中的文件是无法忽略的。

即:.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。

(2)处理步骤

自己思考的方式:(稀烂哈哈)

  1. 将项目clone到本地。
  2. 删除项目中的忽略配置,如:根目录中的.gitignore文件。
  3. 然后在创建新的.gitignore文件,重新配置忽略。

正确的做法:

  1. clone下来的仓库中手动设置,不要检查特定文件的更改情况。

    执行命令如下:
    # 忽略跟踪(提交代码时,忽略某一个文件不提交,即某个文件不被版本控制)
    # file-path是目标文件路径
    git update-index --assume-unchanged file-path # 恢复跟踪
    git update-index --no-assume-unchanged file-path

    这样已经在本地版本库中的文件修改之后,也可以被忽略。

    不过如果执行 git checkout(切换分支)和git reset(回退版本)命令的时候仍然会影响到这些文件,并把内容恢复到被跟踪的内容(再次执行上面命令,修改仍然不会被跟踪)。

  2. 另一种方式:

    Git还提供了另一种exclude的方式来做同样的事情,就是之前说过的在本地版本库中的.git/info/exclude文件中配置忽略,这里设置的忽略规则是你自己本地需要排除的文件, 他不会影响到其他人,也不会提交到版本库中去。

4、autocrlf和safecrlf参数说明

(1)提出问题

我们在配置全局忽略.gitconfig文件的时候,可能会看到如下配置:

[core]
autocrlf = true
safecrlf = false
excludesfile = C:/Users/L/gitignore_global.txt

那么autocrlf = truesafecrlf = false是什么意思?

LF是Linux系统下的换行符,而CRLF是Windows系统下的换行符。由于我们的文件创建于Linux系统下(Git Bash中创建),而保存中Windows系统中,所以文件中的行结束符,要使用Windows下的CRLF格式换行,而在Git中的默认配置是自动转换。

因为在Git的忽略文件中,是一行一行的忽略规则,而autocrlfsafecrlf就是对转变换行格式的具体配置。

(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中忽略文件补充的更多相关文章

  1. 『现学现忘』Git基础 — 14、Git基础操作的总结与补充

    目录 1.Git本地版本库结构 2.Git常用操作方法 3.补充:添加多个文件到暂存区 4.补充:提交操作未写备注 5.补充:从工作区直接提交到版本库 1.Git本地版本库结构 如下图所示: 工作区( ...

  2. 『现学现忘』Git基础 — 37、标签tag(二)

    目录 5.共享标签 6.删除标签 7.修改标签指定提交的代码 8.标签在.git目录中的位置 9.本文中所使用到的命令 提示:接上一篇文章内容. 5.共享标签 默认情况下,git push 命令并不会 ...

  3. 『现学现忘』Git基础 — 5、Git的协作模式

    目录 1.分布式工作流程 2.集中式工作流 3.分支工作流 4.GitFlow 工作流(最流行) 5.Forking 工作流(偶尔使用) 6.总结 1.分布式工作流程 与传统的集中式版本控制系统(CV ...

  4. 『现学现忘』Git基础 — 13、Git的基础操作

    目录 1.Git最基础的使用方式 (1)初始化本地版本库 (2)查看文件的状态 (3)把文件添加到暂存区 (4)把暂存区的内容提交到本地版本库 2.总结本文用到的Git命令 1.Git最基础的使用方式 ...

  5. 『现学现忘』Git基础 — 18、Git对象的总结

    目录 1.Git操作最基本的流程 2.工作目录中文件的状态 3.Git效率说明 提示:前面三篇文章已经分别的对blob对象.tree对象.commit对象进行了详细的说明,这篇文章我们总结一下,Git ...

  6. 『现学现忘』Git基础 — 21、git diff命令

    目录 1.git diff 命令说明 2.比较工作区与暂存区中文件的差别 3.比较暂存区与本地库中文件的差别 4.总结git diff命令常见用法 5.总结 1.git diff 命令说明 在comm ...

  7. 『现学现忘』Git基础 — 22、Git中文件重命名

    目录 1.用学过的命令进行文件重命名 2.使用git mv命令进行文件重命名 我们这篇文章来说说在Git中如何进行文件重命名. 提示一下,下面所说明的是对已经被Git管理的文件进行重命名,未被Git追 ...

  8. 『现学现忘』Git基础 — 2、Git和SVN的区别

    1.Git和SVN的区别 (1)SVN(集中式版本管理系统) 集中式的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者 ...

  9. 『现学现忘』Git基础 — 3、Git介绍

    目录 1.Git的历史 2.Git的特点 3.Git在项目协作开发中所解决的问题 1.Git的历史 Git是目前世界上最先进的分布式版本控制系统,开源.免费. Git 是 Linus (林纳斯)为了帮 ...

随机推荐

  1. 为什么线程通信的方法 wait(), notify()和 notifyAll()被定 义在 Object 类里?

    Java 的每个对象中都有一个锁(monitor,也可以成为监视器) 并且 wait(),notify() 等方法用于等待对象的锁或者通知其他线程对象的监视器可用.在 Java 的线程中 并没有可供任 ...

  2. Java 线程数过多会造成什么异常?

    1.线程的生命周期开销非常高 2.消耗过多的 CPU 资源 如果可运行的线程数量多于可用处理器的数量,那么有线程将会被闲置.大量空 闲的线程会占用许多内存,给垃圾回收器带来压力,而且大量的线程在竞争  ...

  3. 『忘了再学』Shell基础 — 7、Bash基本功能(多命令顺序执行)

    目录 1.多命令执行符: 2.多命令执行符&& 3.多命令执行符|| 4.&&和||联合应用 Linux系统支持多条命令顺序执行,就是我可以依次输入多条命令后,统一按E ...

  4. python中类变量和实例变量的区别

    类变量:可在类的所有实例之间共享的值(也就是说,它们不是单独分配给每个实例的).实例变量:实例化之后,每个实例单独拥有的变量. class student(): age = 0 name = 'stu ...

  5. 使用Vue2+webpack+Es6快速开发一个移动端项目,封装属于自己的jsonpAPI和手势响应式组件

    导语 最近看到不少使用vue制作的音乐播放器,挺好玩的,本来工作中也经常使用Vue,一起交流学习,好的话点个star哦 本项目特点如下 : 1. 原生js封装自己的跨域请求函数,支持promise调用 ...

  6. 手把手教你从零写一个简单的 VUE

    本系列是一个教程,下面贴下目录~1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 今天给大家带来的是实现一个简单的类似 VUE 一样的前端框架,VUE 框架现在应 ...

  7. ES6-11学习笔记--异步迭代

    ES9提供异步迭代: for await of Symbol.asyncIterator   function getPromise(time) { return new Promise((resol ...

  8. pip 和 Conda 镜像站配置

    如果你经常使用 Python,那么你对 pip 和 Conda 一定不陌生,它们作为包管理器,可以非常方便的帮助我们下载需要的 Python 包,但是受限于大多 Python 包的服务器在国外,国内下 ...

  9. SLF4J 报错解决:No SLF4J providers were found

    1.解决SLF4J报错 我们在自己的项目中使用了SLF4J,或者引入了某开源项目时,他的项目中用了SLF4J,运行时会报如下的错误: SLF4J: Failed to load class " ...

  10. victoriaMetrics之byteBuffer

    victoriaMetrics之byteBuffer VictoriaMetrics经常会处理数目庞大的指标,在处理的过程中会涉及指标的拷贝,如果在指标拷贝时都进行内存申请的话,其内存消耗和性能损耗都 ...