从已经从磁盘中删除的Git存储库中删除多个文件

我有一个Git repo,我从使用rm没有git rm)删除了四个文件,我的Git状态如下所示:

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

如何从Git中删除这些文件,而无需像这样手动遍历并添加每个文件:

git rm file1 file2 file3 file4

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

538881 次浏览

您可以使用

git add -u

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

git commit -m "Deleted files manually"

类似

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

可能会这样做。

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

git commit -a

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

您可能正在寻找-A:

git add -A

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

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

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

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

没有git-add的标志只会暂存已删除的文件;如果您修改的所有文件都是已删除的文件,那么您就可以了,但除此之外,您需要运行git-state并解析输出。

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

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

现在把这个放在shell别名中…

对于Git 1. x

$ git add -u

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

对于Git 2.0

构建你的整个工作树:

$ git add -u :/

仅暂存当前路径:

$ git add -u .
git rm test.txt

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

如果你只是运行:

git add -u

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

如果你运行:

git commit -a

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

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

git ls-files --deleted -z | xargs -0 git rmgit commit
git ls-files --deleted -z | xargs -0 git rm

可能是你正在寻找的…它对我有用…

我也需要并使用git gui“阶段更改”按钮。它还添加了所有。

在“舞台改变”之后,我做了“承诺”…

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

到阶段只有被删除的文件:

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

您可以别名您首选的命令集,以方便以后使用。

如前所述

git add -u

阶段删除的文件进行删除,但也修改文件进行更新。

要取消执行修改后的文件,您可以这样做

git reset HEAD <path>


注意:这也可以取消删除的文件,所以要小心那些通配符。

这并不重要,但我不同意选择的答案:

git add -u

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

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

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

在我看来,后者是更好的选择。

如果您想将其添加到您的.gitconfig,请执行以下操作:

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

你所要做的就是运行:

git rma
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.

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

git cola

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

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

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

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

需要-u来引用存储库中存在但在工作目录中不再存在的文件。否则,git add的默认值是查找工作目录中的文件,如果您指定已删除的文件,它将找不到它们。

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

git ls-files --deleted | xargs git rm

您可能还想提交评论。

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

git ls-files --deleted -z | xargs -0 git rm --cached

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

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

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

用于视觉工作室项目

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

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

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

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

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

说明

Windows需要安装bash

git commit -m 'commit msg' $(git ls-files --deleted)

在我删除文件后,这对我来说很有效。

git add-u

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

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

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

-a
--all

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

git add --all && git commit -m "Your commit"

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

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

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

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

git ls-files --deleted -z | xargs -t -0 git rm

(另一种变体)

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

git ls-files --deleted  | grep <folder-name> | xargs git rm
git rm $(git ls-files -d)

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

只是简单地

git add . && git commit -m "the message for commit" && git push

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

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