关于git commit:从已经从磁盘删除的git repo中删除多个文件

Removing multiple files from a Git repo that have already been deleted from disk

我有一个git repo,我从使用rm中删除了四个文件(不是git rm文件),我的git状态如下:

1
2
3
4
#    deleted:    file1.txt
#    deleted:    file2.txt
#    deleted:    file3.txt
#    deleted:    file4.txt

如何从Git中删除这些文件而不必手动遍历和添加每个文件,如下所示:

1
git rm file1 file2 file3 file4

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


对于Git 1 x

1
$ git add -u

这告诉Git自动准备跟踪文件——包括删除以前跟踪的文件。

对于Git 2

准备好整个工作树:

1
$ git add -u :/

只准备当前路径:

1
$ git add -u .


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

可能是你要找的……它对我有效……


你可以使用

1
git add -u

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

1
git commit -m"Deleted files manually"


如果你只是跑:

1
git add -u

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

或者,如果你跑:

1
git commit -a

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

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

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


你可能在找-a:

1
git add -A

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


仅暂存已删除的文件:

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

或(xargs方式):

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

您可以对首选命令集进行别名,以便以后使用。


1
git rm test.txt

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


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

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

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


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

1
git add -u

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

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

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

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


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

1
git commit -a

提交所有更改。其中包括已删除的文件。


1
git ls-files --deleted | xargs git rm

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

这里还有其他一些选择。

1
2
3
4
5
6
7
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加-U

-U——更新只匹配索引中已跟踪的文件,而不是工作树。这意味着它将永远不会准备新文件,但它将准备修订的跟踪文件的新内容,并且如果工作树中的相应文件已被删除,它将从索引中删除文件。

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


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

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


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

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

然后你要做的就是跑步:

1
git rma


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

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

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

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


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

我只是调整了Virender的答案:

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

试试看。

1
2
3
4
5
-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"

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


即使您有许多文件要处理,以下内容也可以工作:

1
git ls-files --deleted | xargs git rm

您可能还需要提交一个注释。

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


如上所述

1
git add -u

将删除的文件分阶段删除,但也将修改的文件分阶段更新。

要取消对修改文件的分页,可以执行以下操作

1
git reset HEAD <path>

如果您希望保持提交的组织性和干净性。
注意:这也可能会取消对已删除文件的保存,因此请小心使用这些通配符。


Git添加的所有标志都不会只处理删除的文件;如果您修改的所有文件都是删除的文件,那么您就可以了,否则,您需要运行Git状态并分析输出。

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

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


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

    在我删除了这些文件之后,这对我很有用。


    我也需要同样的并使用了GitGUI的"StageChanged"按钮。它也增加了所有。

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

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


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

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

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


    1
    git rm $(git ls-files -d)

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


    (还有另一个变化)

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

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

    类似的东西

    1
    git status | sed -s"s/^.*deleted: //" | 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


    对于Visual Studio项目

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

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


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

    1
    git cola

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

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