「git-rm」

  LINUX MANUAL PAGES

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

命令行语法格式(SYNOPSIS)

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

命令简介(DESCRIPTION)

从索引中删除文件、或从工作树和索引中删除文件。git rm不会值删除工作目录中的文件。

没有选项支持只能从工作树中删除文件而文件依旧保留在索引中;如果要这样做,请使用/bin/rm。但可以工作目录的文件,而删除索引中的文件。

要删除的文件必须与分支的提示相同,并且在索引中不能对其内容进行更新,尽管可以使用-f选项覆盖默认行为。

当给出–cached时,暂存的内容必须与分支的尖端磁盘上的文件相匹配,从而仅将该文件从索引中删除。

命令支持的选项及含义(OPTIONS)

<file>…
要删除的文件。
支持全局字符,比如:*.c,删除所有匹配的文件。SHELL中某些字符需要转义,防止被SHELL解释。
如果指定了文件夹的名字,会删除整个目录下及递归子目录下的文件。递归删除时,需要执行-r选项。

-f, –force
覆盖最新的检查。

-n, –dry-run
实际上不会删除任何文件。相反,只显示它们是否存在于索引中,否则将被命令删除。

-r
当给出了前导目录时,只有使用该选项才能允许递归删除。


此选项可用于将命令行选项从文件列表中分离(当文件名可能被误认为命令行选项时,此选项很有用)。

–cached
只删除索引中的文件,而保留工作目录中的文件。

–ignore-unmatch
即使没有文件匹配,依旧返回0状态码。

-q, –quiet
默认删除时会显示日志信息。使用该选项,抑制输出信息。

讨论(DISCUSSION)

<file>…
可以是精确的路径名、文件glob模式、目录名称。

该命令仅删除Git已知的文件。Git不会删除不在仓库中的文件。如果给出的文件是Git未知的,则git rm会返回:fatal: pathspec ‘./path/to/file’ did not match any files

文件通配匹配目录边界。因此,给定两个目录d和d2,使用git rm ‘d*’和git rm ‘d/*’之间存在差异,因为前者还将删除所有目录d2。

删除文件系统中已不存在的文件(REMOVING FILES THAT HAVE DISAPPEARED FROM THE FILESYSTEM)

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 commit -a),请使用以下命令:

git diff –name-only –diff-filter=D -z | xargs -0 git rm –cached

子模块(SUBMODULES)

只有使用gitfile的子模块(这意味着它们被Git版本1.7.8或更高版本克隆)将从工作树中删除,因为它们的存储库位于superprojects的.git目录中。如果子模块(或嵌套在其中的一个)仍然使用.git目录,则git rm会将子模块git目录移动到superprojects的git目录中,以保护子模块的历史记录。如果存在,则gitmodules文件中的submodule.<name>部分也将被删除,该文件将被分段(除非使用-cached或-n)。

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

如果你只想从工作树中删除子模块的本地检出,而不提交删除,请改用git-submodule deinit。有关子模块删除的详细信息,请参阅gitsubmodules。

简单示例(EXAMPLES)

git rm Documentation/\*.txt
从Documentation目录及其任何子目录中的索引中删除所有*.txt文件。
注意:在这个例子中,星号被转义,不会被SHELL解析;这让Git扩展了Documentation/目录下的文件和子目录的路径名,而不是SHELL。

git rm -f git-*.sh
这个例子中,让SHELL解析了星号(即你明确列出文件),它不会删除subdir/git-foo.sh。

存在的问题(BUGS)

每次superproject更新会删除填充的子模块(例如,在切换之前和之后切换提交之间),过期的子模块检出将保留在旧位置。删除旧目录仅在使用gitfile时才安全,否则将会删除子模块的历史记录。执行递归子模块更新时,此步骤将过时。

相关文档(SEE ALSO)

git-add(1)

GIT

Part of the git(1) suite

参考文献