1. 程式人生 > >Git - .gitignore怎麼忽略已經被版本控制的檔案

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 
會報錯,不能執行操作。

參考連結