简体中文 ▾ 主题 ▾ 最新版本 ▾ git-rm 最后更新于 2.50.0

名称

git-rm - 从工作区和暂存区(index)中删除文件

概要

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

描述

从暂存区中,或从工作区和暂存区中删除匹配路径规格(pathspec)的文件。git rm 不会仅从工作目录中删除文件。(没有仅从工作区删除文件而保留在暂存区中的选项;如果您想这样做,请使用 /bin/rm。)要删除的文件必须与分支末端(tip)一致,且暂存区中不能有对其内容的未提交更新,不过这种默认行为可以通过 -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

覆盖最新状态检查(up-to-date check)。

-n
--dry-run

不实际删除任何文件。相反,只是显示文件是否存在于暂存区中,以及是否会被该命令删除。

-r

当给出前导目录名时,允许递归删除。

--

此选项可用于将命令行选项与文件列表分开(当文件名可能被误认为命令行选项时非常有用)。

--cached

使用此选项可以仅从暂存区撤减(unstage)并删除路径。无论工作区文件是否被修改,都将保持不变。

--ignore-unmatch

即使没有匹配的文件,也以零状态退出。

--sparse

允许更新稀疏检出锥体(cone)之外的暂存区条目。通常情况下,git rm 拒绝更新路径不符合稀疏检出锥体的暂存区条目。更多详情请参阅 git-sparse-checkout[1]

-q
--quiet

git rm 通常为每个删除的文件输出一行(以 rm 命令的形式)。此选项会抑制该输出。

--pathspec-from-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”

在为供应商分支(vendor branch)接收新的代码投放时,您可能希望同时记录路径的删除、新路径的添加以及现有路径的修改。

通常情况下,您会先使用此命令从工作区删除所有已跟踪的文件

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.<名称> 部分,该部分也将被删除,并且该文件将被暂存(除非使用了 --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] 套件的一部分