如何讓Git忘記一個現在在.gitignore中的已跟蹤檔案


如果您曾經嘗試將檔案新增到您的 Git 儲存庫(例如,您不希望跟蹤的配置檔案),後來才意識到它們不應該被新增,那麼您可能已經建立了您的.gitignore檔案。但是,不知何故,您會發現 Git 仍然跟蹤它們,即使它們打算新增到.gitignore中。這很煩人,但幸運的是,Git 有辦法永遠忘記這些已跟蹤的檔案。在本文中,我將提供一個分步指南來解決這個常見的 Git 問題。

為什麼 Git 保留被忽略的檔案?

任何進入 Git 的內容都會將其檔案新增到 Git 的索引中,並建立對檔案所做更改的記錄。但是,它們僅透過.gitignore檔案阻止新檔案新增到索引中。一旦放入.gitignore中,這還不夠——除非您指定此命令,否則 Git 仍將跟蹤該檔案。為此,您必須告訴 Git 忘記已跟蹤的檔案。

分步指南:讓 Git 忘記 .gitignore 中的已跟蹤檔案

以下是取消跟蹤您已提交併希望忽略的檔案的步驟

步驟 1:將檔案新增到 .gitignore

如果您尚未將檔名或模式新增到.gitignore,請將檔案新增到.gitignore。這樣,在成功忘記檔案後,Git 不會在任何未來的提交中觸及該檔案。
開啟您的.gitignore檔案並新增以下行(將file_name替換為您的檔名)

file_name

步驟 2:停止 git 跟蹤檔案

其次,您希望從 Git 的索引中刪除該檔案,以便 Git 可以“忘記”該檔案。請記住,此命令不會從您的工作目錄中刪除該檔案,它只會從跟蹤中刪除該檔案。
git rm --cached file_name

替換file_name,使用您希望 Git 忘記的檔案的名稱。

命令解釋

git rm --cached 從您的索引中刪除檔案,但不會從您的專案資料夾中刪除。這意味著 Git 將停止跟蹤該檔案,但該檔案仍以某種方式存在於您的本地目錄中。

步驟 3:提交更改

在您將檔案從索引中取出後,我們必須實際提交這些更改以更新 git 儲存庫。使用以下命令
git commit -m "Remove tracked file that is now in .gitignore"

Git 知道,由於您不再跟蹤該檔案,因此它將不再新增到索引中,因此它將在本次提交中告訴 Git:您不再希望跟蹤此檔案。

步驟 4:推送這些更改(如果您正在使用遠端儲存庫)

如果您正在使用遠端儲存庫(如 GitHub、GitLab 等),請注意不要忽略推送更改以更新遠端儲存庫。
git push

要停止跟蹤檔案並更新遠端儲存庫,我們只需執行此命令。

示例:忽略匹配模式的多個檔案

要從 Git 中刪除多個檔案,匹配某個模式,請將模式新增到.gitignore,並使用git rm --cached和萬用字元。
例如,如果您希望 Git 停止跟蹤所有 .log 檔案,請將*.log新增到 .gitignore

*.log

然後,使用以下命令從索引中刪除所有 .log 檔案

git rm --cached *.log

完成後,提交併推送更改以結束。

重要說明:不要丟失本地更改

如果您希望 Git 忘記檔案,但仍然不想丟失任何本地更改,請確保您已提交這些檔案上的任何工作。在從 Git 索引中刪除檔案並將它們新增到.gitignore時保持本地檔案不受損害,這希望永遠不會發生,但備份任何重要工作總是一個好主意。

步驟總結

  1. 將不需要的檔案新增到.gitignore
  2. 使用git rm --cached file_name從 Git 索引中刪除檔案。
  3. 使用git commit -m "Remove tracked file that is now in .gitignore"提交更改。
  4. 如果您正在使用遠端儲存庫,請推送更改。

如果您按照這些步驟操作,那麼您可以確保 Git 將停止跟蹤您已在.gitignore中設定的檔案。

提示

如果您有很多在最初被跟蹤後需要忽略的檔案,一種快速的方法讓 Git “重新評估”.gitignore是刪除索引中的所有跟蹤檔案,然後僅重新新增需要的檔案

git rm -r --cached .
git add .
git commit -m "Reapply .gitignore settings"

以下命令序列臨時刪除 Git 的索引,並根據當前.gitignore檔案重新新增所有檔案,以便它不會跟蹤任何被忽略的檔案。
透過這些步驟,您將避免將不必要的檔案跟蹤到 Git 儲存庫中,從而節省空間並清理空間。編碼愉快!

更新於:2024年11月4日

21 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.