問題
如果某個文件已經存在於遠程倉庫了,也就是說某個文件已經被版本控制了,如果將該文件添加到.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
會報錯,不能執行操作。