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

參考鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM