## 命名

git-rm - 从工作树和索引中删除文件

## 概要

    git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…

## 描述

从索引中删除文件，或从工作树和索引中删除文件。`git rm`不会从您的工作目录中删除文件。（没有选择只从工作树中删除文件，而是将其保留在索引中; `/bin/rm`如果您想这样做，则使用该选项。）被删除的文件必须与分支的提示相同，并且不会更新他们的内容可以放在索引中，尽管这个默认行为可以被`-f`选项覆盖。当`--cached`给出时，分阶段内容必须匹配分支的尖端或磁盘上的文件，从而允许从索引中删除文件。

## 选项

<file>…

要删除的文件。`*.c`可以给 Fileglobs（例如）删除所有匹配的文件。如果你想让 Git 扩展文件全局字符，你可能需要 shell 来逃避它们。一个主要的目录名（例如`dir`删除`dir/file1`和`dir/file2`）可以删除目录中的所有文件，递归地删除所有子目录，但是这需要`-r`明确给出选项。

-f --force

覆盖最新的检查。

-n --dry-run

切勿删除任何文件。相反，只需显示它们是否存在于索引中，否则将被命令删除。

-r

当给出主目录名时允许递归删除。

--

此选项可用于将命令行选项与文件列表分开，（当文件名可能被误认为是命令行选项时很有用）。

--cached

使用此选项可以取消仅从索引中删除路径的情况。工作树文件，无论是否修改，都将被单独保留。

--ignore-unmatch

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

-q --quiet

`git rm`通常`rm`为每个被删除的文件输出一行（以命令的形式）。该选项禁止输出。

## 讨论

给该命令的 <file> 列表可以是精确的路径名，文件全局模式或主目录名。该命令仅删除 Git 已知的路径。给出你没有告诉 Git 的文件的名称不会删除该文件。

跨越目录边界的文件匹配匹配。因此，给定两个目录`d`和`d2`使用`git rm 'd*'`和之间有区别`git rm 'd/*'`，因为前者也会删除所有目录`d2`。

## 删除已从文件系统中消失的文件

没有选择`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]文件中的 <name> 部分也将被删除，并且该文件将被暂存（除非使用 --cached 或 -n ）。

当 HEAD 与索引中记录的相同时，子模块被认为是最新的，没有跟踪的文件被修改，并且子模块工作树中不存在未被忽略的未跟踪文件。忽略的文件被认为是可消耗的，并且不会阻止子模块的工作树被移除。

如果您只想从工作树中删除子模块的本地签出而不提交删除，请将`deinit`改为使用 git-submodule [1] 。有关子模块删除的详细信息，另请参阅 gitsubmodules [7] 。

## 例子

`git rm Documentation/\*.txt`

`*.txt`从索引中删除`Documentation`目录及其任何子目录下的所有文件。

请注意，`*`在本例中星号是从 shell 引用的; 这让 Git（而不是shell）能够扩展目录下的文件和子目录的路径名`Documentation/`。

`git rm -f git-*.sh`

因为这个例子让 shell 扩展了星号（即你明确列出了这些文件），所以它不会被删除`subdir/git-foo.sh`。

## Bugs

每次父项目更新移除已填充的子模块时（例如，在移除之前和之后在提交之间切换时），旧的子模块签出将保留在旧位置。删除旧目录仅在使用 gitfile 时才是安全的，否则子模块的历史记录也会被删除。执行递归子模块更新时，此步骤将会过时。