设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.50.1 无更改
-
2.50.0
2025-06-16
- 2.43.1 → 2.49.1 无更改
-
2.43.0
2023-11-20
- 2.34.1 → 2.42.4 无变化
-
2.34.0
2021-11-15
- 2.32.1 → 2.33.8 无更改
-
2.32.0
2021-06-06
- 2.26.1 → 2.31.8 无变化
-
2.26.0
2020-03-22
- 2.16.6 → 2.25.5 无变化
-
2.15.4
2019-12-06
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
- 2.1.4 → 2.12.5 无变化
-
2.0.5
2014-12-17
概要
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/file1
和dir/file2
),以移除该目录中的所有文件以及所有子目录,但这需要显式地给定-r
选项。该命令只移除 Git 已知的路径。
文件通配符匹配会跨越目录边界。因此,给定两个目录
d
和d2
,使用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> 正好是
-
,则使用标准输入。路径规格元素通过 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]。
子模块
只有使用 gitfile 的子模块(这意味着它们是用 Git 1.7.8 或更高版本克隆的)才会被从工作区中移除,因为它们的仓库位于超项目的 .git
目录内。如果子模块(或其内部嵌套的子模块之一)仍使用 .git
目录,git
rm
会将子模块的 git 目录移动到超项目的 git 目录中,以保护子模块的历史记录。如果存在,gitmodules[5] 文件中的 submodule.
<name> 部分也将被移除,并且该文件将被暂存(除非使用了 --cached
或 -n
)。
当 HEAD
与索引中记录的相同,没有跟踪文件被修改,并且子模块工作区中不存在未被忽略的未跟踪文件时,子模块被认为是最新。被忽略的文件被认为是可消耗的,并且不会阻止子模块工作区的移除。
如果你只想从工作区中移除子模块的本地检出而不提交删除,请改用 git-submodule[1] deinit
。有关子模块移除的详细信息,另请参见 gitsubmodules[7]。
BUG
每次超项目更新移除一个已填充的子模块(例如在删除前后的提交之间切换时),一个过时的子模块检出将保留在旧位置。仅当旧目录使用 gitfile 时,移除它是安全的,否则子模块的历史记录也将被删除。当递归子模块更新实现后,此步骤将变得过时。