Fork me on GitHub

Git - .gitignore怎么忽略已经被版本控制的文件

问题

如果某个文件已经存在于远程仓库了,也就是说某个文件已经被版本控制了,如果将该文件添加到.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 
会报错,不能执行操作。

参考链接

0%