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. java-設計模式-抽象工場模式

    抽象工廠模式AbstractFactory 一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类. 工廠方法模式中考虑的是一类产品的生产,如畜牧场只养动物.电视机厂只生产电视机,同种类 ...

  2. Centos6 编译安装Python3.6

    1. 安装依赖 yum install gcc openssl-devel bzip2-devel 2. 下载Python3.6 cd /usr/src wget https://www.python ...

  3. 爬虫-数据解析-bs4

    1.数据解析 解析: 根据指定的规则对数据进行提取 作用: 实现聚焦爬虫 数据解析方式: - 正则表达式 - bs4 - xpath 数据解析的通用原理: 数据解析需要作用在页面源码中(一组html标 ...

  4. 学习RabbitMQ(二)

    MOM(message oriented middleware) 消息中间件(是在消息的传递过程中保存消息的容器,消息中间件再将消息从它的源中继到它的目标时,充当中间人的作用,队列的主要目的是提供路由 ...

  5. 51单片机头文件reg51.h详解

    转自:http://www.51hei.com/mcu/2670.html 我们在用c语言编程时往往第一行就是头文件,51单片机为reg51.h或reg52.h,51单片机相对来说比较简单,头文件里面 ...

  6. Android回到页面并刷新数据

    通过对Android Activity的生命周期的了解,需要在后退页面重写onResume()的方法. 建立自己更新数据的函数,并在onCreate()方法中调用. @Override protect ...

  7. h5页面跳转小程序

    2020年以前, 只能通过 web-view内嵌h5跳转小程序,现在  可以直接跳了!!!!!!  官方文档:https://developers.weixin.qq.com/doc/offiacco ...

  8. css实现半圆效果

    效果图: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  9. 这道javascript 面试题 你必须会

    实现一个函数,运算结果可以满足如下预期结果: add(1)(2) // 3 add(1, 2, 3)(10) // 16 add(1)(2)(3)(4)(5) // 15 话不多说,实现如下: fun ...

  10. IP和静态路由技术概述

    1. IP地址的构成 IP地址:32比特的二进制数字,通常采用点分十进制方式表示. IP地址由两部分组成. 网络号码字段(Net-id)用于区分不同的网络.网络号码字段的前几位成为类别字段(又称为类别 ...