Git-命令行-我与忽略文件 .gitignore 的斗智斗勇

来源:互联网 发布:手机淘宝开店在哪里 编辑:程序博客网 时间:2024/06/10 07:37

我又遇到一个奇怪的问题

最近在学习 git 和 git 的命令行操作,之前用的都是开发工具自带的图形化管理工具,对原理也不是很清楚,所以系统学习一下。

今天看到 .gitgnore文件这部分,于是呢,我就在项目中添加,测试一下,然后呢,就发现我添加的规则并没有什么用,于是呢,就有了下面这篇博客的诞生。

什么是.gitgnore文件

.gitgnore,顾名思义,是忽略文件的意思。

之所以有它的存在,是因为有些文件没有上传到远程仓库的必要,一般是一些没有意义的文件,例如一些编译和运行过程中产生的中间文件,或者非常私密的文件,例如签名文件。

如何添加.gitgnore文件

当我们给一个项目使用 git init 添加 git 版本控制的时候,会自动生成 .git 文件 ,以及分别在 project 和 每个 module 中生成一个 .gitgnore 文件。

如下图:

这里写图片描述

当.gitgnore 创建的时候,里面会默认生成一部分内容,但是远远不够的,我们需要给它补充一点内容。

此时,语法不熟悉,也不知道应该忽略些什么,是不是很慌?

不要担心,有一个伟大的开源项目可以救你,gitignore , 这个github 上的开源项目把很多平台 例如 Android , iOS ,C++ 等等一般会用到的 .gitignore 忽略规则给集成到一起,我们找到我们开发平台对应的文件,打开,内容复制粘贴即可。

来张图感受一下~

这里写图片描述

验证规则是否生效

添加了忽略规则之后,你肯定想知道它有没有生效。

举个例子:

我的项目中 .gitignore 文件中有添加了如下内容:

# Freelinefreeline.pyfreeline/freeline_project_description.json

我想验证一下是否生效,可以尝试 git add <filename> 添加被忽略的文件,查看是否能添加成功:

这里写图片描述

还可以使用 git check-ignore -v <filename> 定位到对应规则 在 .gitignore 文件中的具体位置。

这里写图片描述

特殊情况!.gitignore 文件失效了!

首先,检查 .gitignore 文件是否是 project 中总的忽略文件,不要弄成 module 中的了。
其次,检查规则是否写错。

那问题来了,如果上面两个点都没有问题,但是就是不生效,是什么原因?

答案是,当远程仓库或者缓存区已经存在被忽略文件的情况下,这个时候相应的忽略规则是不起作用的。

孩子,你是不是后来才添加的 .gitignore 规则?

我们来测试一下,还用上面的例子,来确认一下是不是这个原因。首先,强制把 被忽略文件添加到缓存区,然后验证规则是否生效。

git add -f freeline.py //强制添加freeline.py 到缓存区git add freeline.py    check-ignore -v freeline.py

这里写图片描述

然后将缓存中的 freeline.py 文件删除 之后再尝试:

git rm --cached freeline.py //将 freeline.py 从缓存区删除git add freeline.py    check-ignore -v freeline.py

这里写图片描述

以上,证明原因的确如此。那么,答案也就慢慢浮现于眼前了,把被缓存文件从 git 的版本管理中删除。

首先,缓存文件从 git 的版本管理中有以下几个状态:

1.只在缓存区

文件较少时:

git rm --cached <filename>

文件较多时:

git rm -r --cached .git add .git commit -m 'XXXX'

2.已经 commit 提交了,但是还没有 push 到远程

这种情况下,我们需要使用撤销 commit 操作了,

git reset <commit_id> //这个命令, 把 commit 历史撤销,对应缓存区内容也撤销,工作区内容不变git add .git commit -m 'XXXX'

3.已经推送到远程

本地部分的,对应上面两种情况操作,远程仓库的,只能手动删除对应的文件了。

结语

这让我想起来一句话,之前一个同事每次遇到奇怪的 bug 时,都会说的一句话,代码不会说谎。

任何问题深究起来,都会找到答案。所以遇到问题,不要放弃,不要抱怨,不要烦躁,仔细分析,肯定能找到解决方法。

最后,晚安,世界。

原创粉丝点击