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

1388

我有一个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 .一样工作,如果可能的话。


3
相关:https://dev59.com/enI-5IYBdhLWcg3wbXxN - kch
12
@seth,使用git rm并不总是方便的,因为删除操作可能来自于其他工具、IDE或文件管理器。例如,使用Visual Studio删除/重命名文件时可能会出现问题。 - Brett Ryan
73
问别人为什么不使用“git rm”有点像问他们为什么不使用“git vim”或“git cd”。这是一件很愚蠢的事情,git应该有一个内置命令或别名来从暂存区中删除已删除的文件,你不应该必须在SO上查找或在午休时间阅读man页面。 - Isabelle Wedin
8
Varinder的回答不是一个好方法。请考虑Cody建议的git add -u,这也是这个问题的答案:http://stackoverflow.com/questions/1402776/how-do-i-commit-all-deleted-files-in-git - Roland
@Roland git add -u 会添加所有被跟踪的修改过的文件。这可能会起作用,因为其他所有内容都已提交,但如果你希望它只是同步删除操作,那么你可能需要花些时间找到一些编辑的正确提交。 - jbo5112
32个回答

5

git-add命令中没有只能暂存已删除文件的标志;如果你所修改的内容仅为已删除的文件,则没问题,否则,你需要运行git-status并解析输出结果。

参考Jeremy的回答,我得到了以下内容:

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

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


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

在我删除文件后,这对我起了作用。


3
你可以使用git add -u <filenames>命令仅将删除的文件添加到暂存区。
例如,如果你删除了templates/*.tpl文件,则使用git add -u templates/*.tpl命令。
在引用库中存在但不再工作目录中存在的文件时,需要使用-u选项。否则,默认的git add命令会在工作目录中查找文件,如果你指定的是已经在那里被删除的文件,它也无法找到它们。

3

我需要相同的功能,所以使用了git gui中的“暂存更改”按钮。它也会添加所有的更改。

在执行了“暂存更改”操作后,我进行了“提交”操作...

这样我的工作目录就变得干净了。


使用GUI是作弊,哈哈!但在GUI设计师满足您的需求的情况下,速度更快。了解如何调整“引擎盖下面的东西”是很好的。 - Dennis
1
FYI:此答案合并自http://stackoverflow.com/questions/1402776/how-do-i-commit-all-deleted-files-in-git - Shog9

2

(另一种变体)

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

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

2

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


1

类似于某些东西

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

可能做到。


2019年git版本2.13.3:git diff --diff-filter=D --name-only | xargs git rm - user151841

1

关于Visual Studio项目的内容

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

当删除的文件路径中包含空格时,这将非常有用。


1

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

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


0

就这么简单

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接