簡體中文 ▾ 主題 ▾ 最新版本 ▾ 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>…​]

描述

從索引中移除匹配 pathspec 的檔案,或者從工作目錄和索引中移除。git rm 不會僅從工作目錄中移除檔案。(沒有選項可以僅從工作目錄移除檔案但保留在索引中;如果要做這個,請使用 /bin/rm。)要移除的檔案必須與分支的最新提交相同,並且其內容不能有任何暫存的更新,儘管預設行為可以透過 -f 選項覆蓋。當給出 --cached 時,暫存的內容必須與分支的最新提交或磁碟上的檔案匹配,允許僅從索引中移除檔案。當使用稀疏檢出時(參見 git-sparse-checkout[1]),git rm 將只移除稀疏檢出模式下的路徑。

選項

<pathspec>...

要移除的檔案。可以給出一個前導目錄名(例如,要移除 dir/file1dir/file2dir)來移除目錄中的所有檔案,以及遞迴地移除所有子目錄,但這需要顯式給出 -r 選項。

命令只移除 Git 已知的路徑。

檔案 globbing 會跨越目錄邊界進行匹配。因此,給定兩個目錄 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>

Pathspec 在 <file> 中而不是在引數中傳遞。如果 <file>-,則使用標準輸入。Pathspec 元素由 LFCR/LF 分隔。Pathspec 元素可以按照 core.quotePath 配置變數的解釋進行引用(參見 git-config[1])。另請參見 --pathspec-file-nul 和全域性 --literal-pathspecs

--pathspec-file-nul

僅在與 --pathspec-from-file 一起使用時有意義。路徑規範元素由 NUL 字元分隔,所有其他字元都被視為字面值(包括換行符和引號)。

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

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

使用“git commit -a”

如果你打算讓下一次提交記錄工作目錄中所有已跟蹤檔案的修改,並記錄已從工作目錄中移除的檔案(與 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 檔案中的 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] 套件的一部分