问题
如果某个文件已经存在于远程仓库了,也就是说某个文件已经被版本控制了,如果将该文件添加到.gitignore
中,是无法生效的。因为.gitignore
是用来控制尚未被纳入版本控制的文件,如果文件已经存在于远程库中,自然也就无法生效了。
于是就此衍生了一个问题:.gitignore
怎么忽略已经被版本控制的文件?
解决方法
方法一
直接在远程库里将想要忽略的文件删除掉,再将该文件写入.gitignore
中即可。
这种做法的前提是,你确定该文件是允许从远程库删除掉的,然而有些时候,这种做法是不可能的。要么没权限去远程库删掉该文件,要么该文件是必须的。
方法二
使用命令git rm --cached filename
,然后将该文件写入.gitignore
中即可。
该命令表示从git仓库中将文件移除,不再进行版本控制,但保留工作区的该文件。
需要注意的是,该命令其实和方法一差不多。git rm
表示移除某个文件,--cached
表示从暂存区中移除,如果不加该参数就是直接从工作区移除了。
工作区就是指的Working Tree,暂存区就是指的Stage。工作区就是我们的磁盘,被版本控制的文件都存放于工作区。如果改动了某个文件,首先要将该文件添加到暂存区(Stage),然后再提交(commit)到本地仓库,最后才推送(push)到远程库。
git rm --cached filename
并不会从物理上删除文件,只是从暂存区中将文件删除。由于该文件原本已经被版本控制了,使用了该命令后,虽然保留了工作区的该文件,但是却会在暂存区中生成一个删除了该文件的记录,如果此时进行commit,就会把版本库里的该文件给删掉了,如果push到远程库,也会被删掉。最终还是走的方法一的路子。
关于git rm --cached filename
的补充
看到有篇文章举例很详细,如下:
- 新建文件1.txt,未被跟踪(Untracked files),提交到暂存区(Changed to be committed),未提交到版本库。 使用
git rm —cached 1.txt
:- 把文件恢复到未被跟踪的状态,即删除暂存区中的1.txt;
- 文件1.txt,已经提交到版本库,工作区,暂存区都是干净的。使用
git rm —cached 1.txt
:- 把工作区的文件1.txt置为了”未跟踪”状态,即Untracked files
- 暂存区生成一个deleted 1.txt的记录,如果提交了,就是把版本库中的1.txt删除。
- 不影响工作区中的文件。
- 文件1.txt, 已经提交到版本库,修改1.txt,并且提交到了暂存区。使用
git rm —cached 1.txt
:- 把工作区的文件1.txt置为了”未跟踪”状态,即Untracked files。
- 暂存区生成一个deleted 1.txt的记录,如果提交了,就是把版本库中的1.txt删除。
- 不影响工作区中的文件。还是修改后的1.txt
- 文件1.txt, 已经提交到版本库,修改1.txt,提交到暂存区,继续修改1.txt。使用
git rm —cached 1.txt
会报错,不能执行操作。