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

时间:2009-01-29 17:18:15

标签: git git-commit git-add git-rm

我有一个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 .相同的方式。

30 个答案:

答案 0 :(得分:2260)

对于Git 1.x

$ git add -u

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

对于Git 2.0

分阶段整个工作树:

$ git add -u :/

仅暂存当前路径:

$ git add -u .

答案 1 :(得分:1345)

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

可能就是你要找的......它对我有用..

答案 2 :(得分:729)

您可以使用

git add -u

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

git commit -m "Deleted files manually"

答案 3 :(得分:355)

如果您只是运行:

git add -u

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

或者,如果你跑:

git commit -a

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

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

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

答案 4 :(得分:165)

你可能正在寻找-A:

git add -A

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

答案 5 :(得分:92)

仅暂存已删除的文件:

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

您可以alias首选命令集,以方便以后使用。

答案 6 :(得分:61)

git rm test.txt

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

答案 7 :(得分:48)

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

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

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

答案 8 :(得分:38)

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

git add -u 

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

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

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

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

答案 9 :(得分:29)

如果这些是唯一的变化,您只需执行

即可
git commit -a

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

答案 10 :(得分:19)

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.

答案 11 :(得分:15)

git add -u

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

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

答案 12 :(得分:14)

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

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

答案 13 :(得分:10)

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

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

然后你要做的就是运行:

git rma

答案 14 :(得分:8)

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

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

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

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

答案 15 :(得分:6)

试试吧。

-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"

答案 16 :(得分:6)

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

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

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

答案 17 :(得分:5)

git-add的标志都不会只删除已删除的文件;如果您修改了所有已删除的文件,那么您没问题,但是否则,您需要运行git-status并解析输出。

取消Jeremy的回答,这就是我得到的:

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

答案 18 :(得分:5)

如上所述

git add -u

将已删除的文件暂存以进行删除,但还修改了要更新的文件。

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

git reset HEAD <path>

如果你想保持你的提交井井有条。 注意: 这也可以取消删除已删除的文件,所以要小心那些通配符

答案 19 :(得分:5)

即使您要处理大量文件,以下内容仍然有效:

git ls-files --deleted | xargs git rm

您可能还想提交评论。

有关详细信息,请参阅:Useful Git Scripts

答案 20 :(得分:4)

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

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

答案 21 :(得分:3)

我需要同样的东西 并使用git gui“stage changed”按钮。 它还增加了所有。

在“阶段改变”之后我做了“提交”......

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

答案 22 :(得分:2)

您可以使用git add -u <filenames>仅暂存已删除的文件。

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

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

答案 23 :(得分:1)

(又一种变化)

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

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

答案 24 :(得分:1)

git rm $(git ls-files -d)

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

答案 25 :(得分:1)

类似

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

可能会这样做。

答案 26 :(得分:1)

添加系统别名以暂存已删除的文件作为命令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

答案 27 :(得分:0)

对于visual studio项目

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

在删除的文件路径有空格

时很有用

答案 28 :(得分:0)

很简单

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

答案 29 :(得分:-1)

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

git cola

然后选择我想要暂存的所有已删除文件。

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