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

我有一个Git仓库,使用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 .相同的方法git add . 如果可能的话。

对于Git 1.x

 $ git add -u 

这告诉git自动登台跟踪文件 – 包括删除以前跟踪的文件。

对于Git 2.0

要整个工作树:

 $ git add -u :/ 

要站在当前的道路上:

 $ git add -u . 
 git ls-files --deleted -z | xargs -0 git rm 

可能是你正在寻找..它适用于我..

您可以使用

 git add -u 

要将删除的文件添加到暂存区域,请将其提交

 git commit -m "Deleted files manually" 

如果你只是运行:

 git add -u 

git会更新它的索引,以知道你已经删除的文件实际上应该是下一次提交的一部分。 然后你可以运行“git commit”来检查这个变化。

或者,如果你运行:

 git commit -a 

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

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

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

你可能正在寻找-A:

 git add -A 

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

阶段删除的文件:

 for x in `git status | grep deleted | awk '{print $3}'`; do git rm $x; done 

或(xargs方式):

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

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

 git rm test.txt 

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

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

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

从文件系统中删除的所有文件都被删除后添加到索引中。

这不是真的很重要,但我不同意所选的答案:

 git add -u 

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

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

另一方面只会删除被追踪的已删除文件。

所以后者在我看来是更好的select。

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

 git commit -a 

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

 git ls-files --deleted | xargs git rm 

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

这里有一些其他的select。

 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 add -u

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

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

这个简单的解决scheme适用于我:

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

如果你想把它添加到你的.gitconfig请执行以下操作:

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

那么你所要做的就是运行:

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

这将删除以前由git跟踪的所有被删除的文件,以及处理文件名中有空格的情况。

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

编辑: – --cached和 – 删除标志串联使用,以防止意外删除尚未被删除的文件。

尝试一下。

 -a --all Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected. git add . && git commit -m -a "Your commit" 

要么

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

请使用-t来查看哪个命令实际上正在运行

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

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

没有任何标志git-add只会删除已删除的文件; 如果你所有的修改都是被删除的文件,那么你很好,但除此之外,你需要运行git-status并parsing输出。

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

 git status | sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm 
  1. 获取文件的状态。
  2. 对于已删除的文件,请隔离文件的名称。
  3. 删除所有以#开头的行,以及删除了“删除”一词的状态行; 我不记得那是什么东西,确切地说,现在已经不存在了,所以你可能需要对不同的情况进行修改。 我认为expression式的分组可能是一个GNU特有的function,所以如果你不使用gnutils,你可能需要添加多个grep -v行。
  4. 将文件传递给git rm

现在坚持在一个shell别名…

如上所述

 git add -u 

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

取消修改的文件,你可以做

 git reset HEAD <path> 

如果你想保持你的承诺有组织和干净。
注意:这也可能会取消已删除的文件,请小心使用这些通配符。

即使您有很多文件需要处理,以下方法仍然有效:

 git ls-files --deleted | xargs git rm 

你可能也想要提交一个评论。

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

我需要相同的和使用git gui“舞台改变”button。 它也增加了所有。

而“阶段改变”后,我做了“承诺”…

所以我的工作目录再次清洁。

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

我已经删除了这些文件后,这工作对我来说。

你可以使用git add -u <filenames>git add -u <filenames>已删除的文件。

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

-u是必需的,以便引用存在于存储库中但不再存在于工作目录中的文件。 否则, git add的默认值是在工作目录中寻找文件,如果你指定了在那里删除的文件,它将不会find它们。

就像是

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

可以做到这一点。

对于视觉工作室项目

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

这在删除的文件path有空格时很有用

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

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

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

注意

Windows需要安装bash

(又一变化)

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

 git ls-files --deleted | grep <folder-name> | xargs git rm 

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

 git cola 

并select所有我想要删除的文件。

(注意,我通常在git中执行一切命令行,但是git处理移除的文件有点尴尬)。