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 将仅删除稀疏检出模式内的路径。

选项

<pathspec>…​

要删除的文件。可以给出前导目录名称(例如,要删除dir/file1dir/file2,则使用dir),以删除目录中的所有文件以及所有子目录,但这需要显式给出-r选项。

该命令仅删除 Git 已知的路径。

文件通配符匹配跨越目录边界。因此,给定两个目录dd2,使用git rm 'd*'git rm 'd/*'之间存在差异,因为前者还会删除目录d2的所有内容。

有关更多详细信息,请参阅 gitglossary[7]中的“路径规范”条目。

-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>正好是-,则使用标准输入。路径规范元素由 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] 文件中的 submodule.<name> 部分也将被删除,并且该文件将被暂存(除非使用 --cached 或 -n)。

当 HEAD 与索引中记录的 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