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] 中的 *路径说明* 条目。

-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 与索引中记录的相同,没有修改已跟踪的文件,并且子模块的工作树中不存在未跟踪的未忽略的文件时,子模块被认为是最新状态。忽略的文件被认为是可牺牲的,不会阻止删除子模块的工作树。

如果您只想从工作树中删除子模块的本地检出而不提交删除,请改用 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