ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Git 中提交所有已删除的文件? [复制]

我有一个 Git 存储库,我使用 rmnot git rm)删除了四个文件,我的 Git 状态如下所示:

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

如何从 Git 中删除这些文件,而无需手动检查并添加每个文件,如下所示:

git rm file1 file2 file3 file4

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

@seth,使用 git rm 并不总是很方便,删除可能来自单独的工具、IDE 或文件管理器。删除/重命名文件时,Visual Studio 可能会很痛苦。
呃,问为什么有人不使用 git rm 有点像问他们为什么不使用 git vimgit cd。这是一件愚蠢的事情,git应该有一个内置的命令或别名来从暂存中删除已删除的文件,并且您不必在SO上查找它或在午休时间阅读手册页。
Varinder的回答不是一个好方法。按照 Cody 的建议考虑 git add -u ,这也是这个问题的答案:stackoverflow.com/questions/1402776/…

c
carl

对于 Git 1.x

$ git add -u

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

对于 Git 2.0

暂存整个工作树:

$ git add -u :/

仅暂存当前路径:

$ git add -u .

请注意,这将添加所有已更改、跟踪的文件——已删除和更新。
@beanland,如果您不希望它全部获取,您只需要提供要修改的特定文件的路径。例如 git add -u [路径]
git add -u folder/ 在文件夹中运行此操作
仅供参考:此答案从 stackoverflow.com/questions/1402776/… 合并
这可能是人们在到达此页面时提出的问题,也可能是 OP 实际要问的问题,但它并没有回答所提出的确切问题。
N
Nick Volynkin
git ls-files --deleted -z | xargs -0 git rm 

可能是您正在寻找的东西..它对我有用..


对于 Windows,请尝试在配置中添加以下别名,而不使用 Evan Moran 上面所述的引号 'remove = !git ls-files --deleted -z | xargs -0 git rm'
警惕名称中带有空格的文件
@DaveEveritt git ls-files --deleted -z | xargs -0 git rm
Cody 建议的 git add -u 是一种更简单、更安全的方法,不会有意外删除文件的风险。
否决这个,因为它是错误的答案,即使它可能适用于某些文件。使用下面的“git add -u”。这就是它的用途。
C
Cody Caughlan

您可以使用

git add -u

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

git commit -m "Deleted files manually"

请注意 Google 用户:它也会将修改后的跟踪文件添加到暂存区域。
仅当您刚刚删除文件并希望立即暂存它们时才运行此命令。
我无法从 bitbucket 存储库中删除文件]
E
Emil Sit

如果您只是运行:

git add -u

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

或者,如果您运行:

git commit -a

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

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

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

是的,git commit -a 会做我想做的事,除了在某些情况下我有不想提交的文件,所以我想手动准备提交。
commit -a 本质上是先执行“add -u”;它将使用对已知文件的任何更改(无论是删除还是简单更改)来更新索引。您当然可以更具体,只添加/rm 您想要的文件。 git.or.cz/gitwiki/… 可能会有所帮助。
“更新:..”下面的命令集就像一个魅力。谢谢!
非常感谢'git ls-files --deleted | xargs git rm'!
“git ls-files --deleted | xargs git rm”是正确答案!谢谢!
D
Dustin

您可能正在寻找-A:

git add -A

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


顺便说一句,使用 -u 限制添加到跟踪的文件, -a 也将包括未跟踪的文件。只是想我会指出其中的区别。
在这个阶段,您不妨通过 commit -a 标志添加所有内容。
P
PuzzledVacuum

仅暂存已删除的文件:

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您喜欢的命令集以方便日后使用。


@Saeb 了解队列,但 xargs 大约需要 15 分钟才能掌握。
git status | awk '/deleted/ {print $3}' | xargs git rm 将是一种更短的方法。 grep | awk... 说不。
git rm $(git ls-files --deleted) 不是更方便(从 this 复制)。
xargs 或上面的 $() 替换,如果你知道列表不是很大的话。如果列表 很大:git ls-files --deleted | while read f; do git rm $f; done
@Andrew xargs 对于一个巨大的列表可能比 while 循环更有效,因为它每次执行 git rm 时都会传递多个参数。要限制每次执行时传递给 git rm 的参数数量,请使用 -n 选项:git ls-files --deleted | xargs -n 15 git rm
h
hichris123
git rm test.txt

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


虽然它会起作用,但我经常发现自己仅通过 rm 就删除了大量文件,后来又后悔了。
为什么这比做 git add -u 更糟糕?将已删除的特定文件添加到提交中似乎比添加 ALL 更改更安全。
实际上,根据问题的最后一行“我只想要一个命令,从 git 中删除所有文件,这些文件也从磁盘中删除。”实际上这应该是最好的答案。
@Ramsharan 不,因为它根本不这样做。这会删除一个文件; OP 明确要求“所有”已删除文件。
@Ramsharan 不,这就是重点-在几乎所有情况下,您都不能简单地使用通配符(没有通配符可以匹配)。这就是为什么主要的答案要复杂得多。
M
Malte Tancred

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

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

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


S
Stephan Tual

并不是说它真的很重要,但我不同意选择的答案:

git add -u 

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

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

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

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


S
SpoonMeiser

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

git commit -a

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


不知道为什么我被否决了; git 可以很好地识别已删除的文件,即使您没有使用 git rm 明确告知它。
你被否决了,因为“-a”不是一个可接受的开关,它是“-A”。编辑你的答案。
不,“-a”是可接受的开关,因为命令是提交。 “-A”是添加但不提交的开关。我看到您建议的修改已被拒绝。
如果您唯一要提交的是已删除的文件,请添加开关 --allow-empty
错误,实际上 --allow-empty 仅在您执行 git rm --cached 时才需要
S
Sijo Kurian
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.

O
Obay

git 添加 -u

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

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


The top-voted answer 已经说过要使用 git add -u。您的答案中的所有其他内容来自哪里,文档?如果有,您应该链接到文档并对其进行块引用。
H
Hossam Badri

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

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

我认为您应该始终在当前工作目录上使用 git shell
这很好也很简单,但不适用于递归文件夹。
@BehnazChangizi 我认为确实如此,stackoverflow.com/questions/1054044/…
@PvdL 不接受路径中的空格是操作系统特定的问题
E
Evan Moran

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

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

然后你所要做的就是运行:

git rma

并从 cmd 行 git config --global alias.rmd '!git ls-files --deleted -z | xargs -0 git rm'
j
jonathan3692bf
git ls-files --deleted -z | xargs -0 git rm --cached

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

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

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


a
alberand
git rm $(git ls-files -d)

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


S
SherylHohman

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

-a --全部

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

或者

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

git add --all && git commit -m "Your commit" 这在 windows-7 中对我有用,使用 Git bash 命令 shell。
以下命令在 windows-7 中为我工作,使用 Git bash 命令 shell: $ git add --all && git commit -m "remove property files" [master 58c41ac] remove property files 1 file changed, 9 deleted(-) 。 .. 然后将那些已提交的更改推送到远程存储库已运行: $ git push origin .. 计数对象:10,完成。
D
DarkNeuron

如前所述

git add -u

暂存已删除的文件以进行删除,同时还修改了文件以进行更新。

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

git reset HEAD <path>

如果你想保持你的提交有条理和干净。注意:这也可以取消暂存已删除的文件,因此请小心使用这些通配符。


IMO 重置是最好的,因为您可以删除该文件。可惜有 1000 人支持添加。
l
l3x

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

git ls-files --deleted | xargs git rm

您可能还想发表评论。

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


T
Tunaki

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

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

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

X
Xiong Chiamiov

git-add 的任何标志都不会只暂存已删除的文件;如果您修改的只是已删除的文件,那么您很好,否则,您需要运行 git-status 并解析输出。

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

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm

获取文件状态。对于已删除的文件,隔离文件名。删除所有以#s 开头的行,以及其中包含“已删除”一词的状态行;我不记得它到底是什么,而且它不再存在了,所以你可能需要针对不同的情况进行修改。我认为表达式的分组可能是 GNU 特有的功能,所以如果你不使用 gnutils,你可能需要添加多个 grep -v 行。将文件传递给 git rm。

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


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

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


S
Serdar

我需要相同的并使用 git gui “stage changed”按钮。它还添加了所有内容。

在“阶段改变”之后,我做出了“承诺”......

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


好吧,使用 gui 是在作弊,哈哈!但在 GUI 设计器满足您的需求的情况下更快。很高兴知道如何修补“引擎盖下的东西”。
仅供参考:此答案从 stackoverflow.com/questions/1402776/… 合并
t
thomasrutter

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

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

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


H
Haris Krajina

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

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

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

笔记

Windows 需要安装 bash


u
urban

(另一种变体)

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

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

J
Jeremy French

就像是

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

可以做到。


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

对于视觉工作室项目

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

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


R
Ricardolcm

简直了

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

d
dahe

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

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