簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-rm 最後更新於 2.50.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 將僅移除稀疏檢出模式內的路徑。

選項

<pathspec>...

要移除的檔案。可以指定一個開頭的目錄名(例如 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=<file>

路徑規格透過 <file> 而非引數傳遞。如果 <file> 正好是 -,則使用標準輸入。路徑規格元素透過 LFCR/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] 檔案中的 submodule.<name> 部分也將被移除,並且該檔案將被暫存(除非使用了 --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

BUG

每次超專案更新移除一個已填充的子模組(例如在刪除前後的提交之間切換時),一個過時的子模組檢出將保留在舊位置。僅當舊目錄使用 gitfile 時,移除它是安全的,否則子模組的歷史記錄也將被刪除。當遞迴子模組更新實現後,此步驟將變得過時。

另請參閱

GIT

Git[1] 套件的一部分

scroll-to-top