1357

我有一个 Git 存储库,我已从使用rm( not git rm ) 中删除了四个文件,我的 Git 状态如下所示:

#    deleted:    file1.txt
#    deleted:    file2.txt
#    deleted:    file3.txt
#    deleted:    file4.txt

如何从 Git 中删除这些文件,而无需手动检查并添加每个文件,如下所示:

git rm file1 file2 file3 file4

git add .理想情况下,如果可能的话,我正在寻找以相同方式工作的东西。

4

31 回答 31

2341

对于 Git 1.x

$ git add -u

这告诉 git 自动暂存跟踪的文件——包括删除以前跟踪的文件。

对于 Git 2.0

暂存整个工作树:

$ git add -u :/

仅暂存当前路径:

$ git add -u .
于 2009-09-10T00:13:25.730 回答
1381
git ls-files --deleted -z | xargs -0 git rm 

可能是您正在寻找的东西..它对我有用..

于 2011-02-28T20:21:49.430 回答
744

您可以使用

git add -u

将删除的文件添加到暂存区,然后提交它们

git commit -m "Deleted files manually"
于 2009-01-29T17:25:48.787 回答
360

如果您只是运行:

git add -u

git 将更新其索引以知道您已删除的文件实际上应该是下一次提交的一部分。然后您可以运行“git commit”来签入该更改。

或者,如果您运行:

git commit -a

它将自动接受这些更改(以及任何其他更改)并提交它们。

更新:如果您只想添加已删除的文件,请尝试:

git ls-files --deleted -z | xargs -0 git rm
git commit
于 2009-09-10T00:15:12.293 回答
169

您可能正在寻找-A:

git add -A

这类似于 git add -u,但也会添加新文件。这大致相当于 hg 的addremove命令(虽然移动检测是自动的)。

于 2009-01-29T18:10:14.173 回答
95

仅暂存已删除的文件:

for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done

或者(xargs 方式):

git status | awk '/deleted/ {print $2}' | xargs git rm

您可以为您喜欢的命令集设置别名,以方便以后使用。

于 2011-11-26T10:34:06.133 回答
64
git rm test.txt

在您删除实际文件之前或之后。

于 2009-09-10T00:13:29.777 回答
50

通过使用带有 '--all' 或 '--update' 选项的 git-add,你可能会得到比你想要的更多的东西。新的和/或修改过的文件也将被添加到索引中。当我想从 git 中删除已删除的文件而不触及其他文件时,我有一个 bash 别名设置:

alias grma='git ls-files --deleted -z | xargs -0 git rm'

已从文件系统中删除的所有文件都将作为已删除添加到索引中。

于 2009-01-31T04:50:22.773 回答
41

并不是说它真的很重要,但我不同意选择的答案:

git add -u 

... 如果工作树中的相应文件已被删除,则将从索引中删除文件,但它也会暂存已修改的跟踪文件的新内容。

git rm $(git ls-files --deleted)

...另一方面,只会 rm 跟踪的已删除文件。

所以我认为后者是更好的选择。

于 2012-04-09T11:24:42.170 回答
31

如果这些是唯一的变化,你可以简单地做

git commit -a

提交所有更改。这将包括已删除的文件。

于 2009-01-29T17:29:39.853 回答
21
git ls-files --deleted | xargs git rm 

是仅添加已删除文件的最佳选择。

这是其他一些选项。

git add .  => Add all (tracked and modified)/new files in the working tree.

git add -u => Add all modified/removed files which are tracked.

git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree.

git commit -a -m "commit message" - Add and commit modified/removed files which are tracked.
于 2012-10-01T19:36:48.733 回答
18

git 添加 -u

-u --update 只匹配索引中已经跟踪的文件而不是工作树。这意味着它永远不会暂存新文件,但它将暂存已修改的跟踪文件的新内容,并且如果工作树中的相应文件已被删除,它将从索引中删除文件。

如果没有给出,默认为“。”;换句话说,更新当前目录及其子目录中的所有跟踪文件。

于 2014-08-26T12:24:42.123 回答
14

这个简单的解决方案对我来说很好:

git rm $(git ls-files --deleted)
于 2015-11-06T13:32:13.260 回答
11

如果你想将它添加到你的.gitconfig这样做:

[alias]
  rma = !git ls-files --deleted -z | xargs -0 git rm

然后你所要做的就是运行:

git rma
于 2012-07-25T20:47:58.067 回答
9
git ls-files --deleted -z | xargs -0 git rm --cached

这将删除之前由 git 跟踪的所有已删除文件,并处理文件名中包含空格的情况。

根据您的 POSIX 变体,您可能需要使用xargs -0 -r: 这将导致xargs在管道空内容时正常退出。

编辑:--cached--deleted标志一起使用,以防止意外删除尚未删除的文件。

于 2014-01-04T20:34:56.423 回答
8
git rm $(git ls-files -d)

删除命令列出的所有文件git ls-files(-d 仅显示已删除的文件)。不适用于文件名或路径中有空格但易于记忆的文件

于 2018-12-10T08:19:17.227 回答
7

告诉命令自动暂存已修改和删除的文件,但您没有告诉 Git 的新文件不受影响:

-a --
全部

git add . && git commit -m -a "Your commit"

或者

git add --all && git commit -m "Your commit"
于 2015-03-09T15:05:17.987 回答
6

如前所述

git add -u

暂存已删除的文件以进行删除,同时还修改了文件以进行更新。

要取消暂存修改过的文件,您可以执行

git reset HEAD <path>

如果你想保持你的提交有条理和干净。
注意:这也可以取消暂存已删除的文件,因此请小心使用这些通配符。

于 2012-02-21T18:43:33.530 回答
6

即使您有很多文件要处理,以下操作也将起作用:

git ls-files --deleted | xargs git rm

您可能还想发表评论。

有关详细信息,请参阅: 有用的 Git 脚本

于 2013-05-24T13:45:17.003 回答
6

请使用-t查看实际运行的是哪个命令

我只是调整了 Virender 的答案来做同样的事情:

git ls-files --deleted -z | xargs -t -0 git rm
于 2016-04-17T15:00:07.647 回答
5

git-add 的任何标志都不会只暂存已删除的文件;如果您修改的只是已删除的文件,那么您很好,否则,您需要运行 git-status 并解析输出。

根据杰里米的回答,这就是我得到的:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. 获取文件状态。
  2. 对于已删除的文件,隔离文件名。
  3. 删除所有以#s 开头的行,以及其中包含“已删除”一词的状态行;我不记得它到底是什么,而且它不再存在了,所以你可能需要针对不同的情况进行修改。我认为表达式分组可能是 GNU 特有的功能,所以如果您不使用 gnutils,则可能需要添加多grep -v行。
  4. 将文件传递给git rm.

现在将其粘贴在 shell 别名中...

于 2009-07-25T23:41:05.943 回答
4
git commit -m 'commit msg' $(git ls-files --deleted)

在我删除文件后,这对我有用。

于 2014-08-05T14:40:38.460 回答
3

我需要相同的并使用 git gui “stage changed”按钮。它还添加了所有内容。

在“阶段改变”之后,我做出了“承诺”......

所以我的工作目录又干净了。

于 2011-11-15T14:29:42.397 回答
3

您只能用于git add -u <filenames>暂存已删除的文件。

例如,如果您删除了文件templates/*.tpl,则使用git add -u templates/*.tpl.

-u为了引用存储库中存在但不再存在于工作目录中的文件,这是必需的。否则,默认git add为在工作目录中查找文件,如果您指定已在该目录中删除的文件,则不会找到它们。

于 2013-03-07T01:29:28.253 回答
2

添加用于暂存已删除文件的系统别名作为命令rm-all

UNIX alias rm-all='git rm $(git ls-files --deleted)'

视窗 doskey rm-all=bash -c "git rm $(git ls-files --deleted)"

笔记

Windows 需要已bash安装。

于 2014-02-19T12:16:55.400 回答
2

(另一种变体)

我想从磁盘文件中删除所有已删除的文件,但从一个特定文件夹中删除,而其他文件夹保持不变。以下对我有用:

git ls-files --deleted  | grep <folder-name> | xargs git rm
于 2016-11-23T10:32:10.720 回答
1

就像是

git status | sed -s "s/^.*deleted: //" | xargs git rm 

可以做到。

于 2009-01-29T17:28:52.820 回答
1

对于视觉工作室项目

'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm' 

当删除的文件路径有空间时,这很有用

于 2014-02-04T15:34:59.457 回答
0

简直了

git add . && git commit -m "the message for commit" && git push
于 2021-02-02T08:55:46.740 回答
0

从 Repo 中删除所有以 .log 结尾的文件,但不删除本地存储

git rm --cached $(git ls-files | grep "\.log$")

于 2021-12-09T13:33:11.373 回答
-1

迄今为止我发现的最灵活的解决方案是

git cola

并选择我要暂存的所有已删除文件。

(请注意,我通常在 git 中执行所有命令行操作,但 git 处理删除的文件有点尴尬)。

于 2012-10-03T14:28:18.240 回答