Git
English ▾ 主題 ▾ 最新版本 ▾ git-rm 最後更新於 2.43.0

名稱

git-rm - 從工作樹和索引中移除檔案

概要

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]
	  [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]
	  [--] [<pathspec>…​]

描述

從索引或從工作樹和索引中移除符合路徑規格的檔案。git rm 不會僅從您的工作目錄中移除檔案。(沒有選項可以僅從工作樹中移除檔案,但仍將其保留在索引中;如果您想這樣做,請使用 /bin/rm。)要移除的檔案必須與分支的頂端相同,且不能在索引中暫存對其內容的更新,不過可以使用 -f 選項覆寫該預設行為。當給定 --cached 時,暫存的內容必須與分支的頂端或磁碟上的檔案相符,允許僅從索引中移除檔案。當使用稀疏檢出時(請參閱 git-sparse-checkout[1]),git rm 只會移除稀疏檢出模式中的路徑。

選項

<路徑規格>…​

要移除的檔案。可以給定一個前導目錄名稱(例如,dir 來移除 dir/file1dir/file2)來移除目錄中的所有檔案,並遞迴移除所有子目錄,但這需要明確給定 -r 選項。

此命令僅移除 Git 已知的路徑。

檔案全域匹配跨越目錄邊界。因此,假設有兩個目錄 dd2,使用 git rm 'd*'git rm 'd/*' 之間存在差異,因為前者也會移除目錄 d2 的所有內容。

如需更多詳細資訊,請參閱 gitglossary[7] 中的 _pathspec_ 條目。

-f
--force

覆寫最新檢查。

-n
--dry-run

實際上不移除任何檔案。相反,僅顯示它們是否存在於索引中,並且否則會被此命令移除。

-r

當給定前導目錄名稱時,允許遞迴移除。

--

此選項可用於將命令列選項與檔案清單分開(當檔案名稱可能被誤認為是命令列選項時很有用)。

--cached

使用此選項僅取消暫存和從索引中移除路徑。無論修改與否,工作樹檔案都將保留。

--ignore-unmatch

即使沒有匹配到任何檔案,也以零狀態結束。

--sparse

允許更新稀疏檢出錐體之外的索引條目。通常,git rm 會拒絕更新路徑不符合稀疏檢出錐體的索引條目。有關更多資訊,請參閱 git-sparse-checkout[1]

-q
--quiet

git rm 通常會為每個移除的檔案輸出一個行(以 rm 命令的形式)。此選項會抑制該輸出。

--pathspec-from-file=<檔案>

路徑規格在 <檔案> 中傳遞,而不是在命令列引數中傳遞。如果 <檔案> 正好是 -,則會使用標準輸入。路徑規格元素以 LF 或 CR/LF 分隔。路徑規格元素可以用配置變數 core.quotePath 解釋的方式加上引號(請參閱 git-config[1])。另請參閱 --pathspec-file-nul 和全域 --literal-pathspecs

--pathspec-file-nul

僅在 --pathspec-from-file 時有意義。路徑規格元素以 NUL 字元分隔,所有其他字元都按字面意義取用(包括換行符號和引號)。

移除已從檔案系統中消失的檔案

沒有選項可以讓 git rm 僅從索引中移除已從檔案系統中消失的路徑。但是,根據使用案例,有幾種方法可以做到這一點。

使用「git commit -a」

如果您打算讓您的下一次提交記錄工作樹中追蹤檔案的所有修改,並記錄已使用 rm(而不是 git rm)從工作樹中移除的所有檔案,請使用 git commit -a,因為它會自動注意到並記錄所有移除。您也可以透過使用 git add -u 來達到類似的效果,而無需提交。

使用「git add -A」

當接受供應商分支的新程式碼下降時,您可能想要記錄路徑的移除、新路徑的添加以及現有路徑的修改。

通常,您會先使用此命令從工作樹中移除所有追蹤檔案

git ls-files -z | xargs -0 rm -f

然後將新程式碼解壓縮到工作樹中。或者,您可以將變更 rsync 到工作樹中。

在那之後,記錄工作樹中所有移除、添加和修改的最簡單方法是

git add -A

請參閱 git-add[1]

其他方法

如果您真正想做的只是從索引中移除不再存在於工作樹中的檔案(可能是因為您的工作樹很髒,因此您無法使用 git commit -a),請使用以下命令

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

子模組

只有使用 gitfile 的子模組(表示它們是使用 Git 1.7.8 或更新版本複製的)才會從工作樹中移除,因為它們的存放庫存在於超專案的 .git 目錄中。如果子模組(或其中巢狀的子模組)仍然使用 .git 目錄,git rm 會將子模組的 git 目錄移到超專案的 git 目錄中,以保護子模組的歷史記錄。如果存在,也會移除 gitmodules[5] 檔案中的子模組.<名稱> 區段,並且該檔案將會被暫存(除非使用 --cached 或 -n)。

當 HEAD 與索引中記錄的相同時,當沒有修改追蹤的檔案時,以及當子模組的工作樹中不存在未追蹤且未忽略的檔案時,子模組會被視為是最新的。忽略的檔案會被視為可有可無,並且不會阻止移除子模組的工作樹。

如果您只想從您的工作樹中移除子模組的本機檢出,而無需提交移除,請改用 git-submodule[1] deinit。另請參閱 gitsubmodules[7] 以取得有關子模組移除的詳細資訊。

範例

git rm Documentation/\*.txt

從索引中移除 Documentation 目錄及其任何子目錄下的所有 *.txt 檔案。

請注意,在此範例中,星號 * 是以引號括住的,以防止 shell 解譯;這讓 Git 而不是 shell,展開 Documentation/ 目錄下的檔案和子目錄的路徑名稱。

git rm -f git-*.sh

由於此範例讓 shell 展開星號(也就是說,您正在明確列出檔案),因此它不會移除 subdir/git-foo.sh

錯誤

每次超專案更新移除已填入的子模組時(例如,在移除之前和之後在提交之間切換時),舊位置中將保留過時的子模組檢出。只有在舊目錄使用 gitfile 時,移除舊目錄才是安全的,否則子模組的歷史記錄也會被刪除。當實作遞迴子模組更新時,此步驟將會過時。

另請參閱

GIT

屬於 git[1] 套件的一部分

scroll-to-top