「Git」- rm

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

参考文献