Git - .gitignore怎麼忽略已經被版本控制的檔案
阿新 • • 發佈:2019-01-08
問題
如果某個檔案已經存在於遠端倉庫了,也就是說某個檔案已經被版本控制了,如果將該檔案新增到.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
會報錯,不能執行操作。