简体中文 ▾ 主题 ▾ 最新版本 ▾ 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