当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《从已从磁盘中删除的Git存储库中删除多个文件》经验,为你挑选了20个好方法。

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



1> carl..:

对于Git 1.x

$ git add -u

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

对于Git 2.0

分阶段整个工作树:

$ git add -u :/

仅仅暂存当前路径:

$ git add -u .


请注意,这将添加*所有*已更改,已跟踪的文件 - 已删除和更新.
还有`git add -u folder /`来在一个文件夹中运行这个操作
@beanland,如果您不想让它们全部获取,您只需要提供要修改的特定文件的路径.例如git add -u [path]
仅供参考:这个答案来自http://stackoverflow.com/questions/1402776/how-do-i-commit-all-deleted-files-in-git

2> 小智..:
git ls-files --deleted -z | xargs -0 git rm 

可能是你在找什么..它对我有用..


@DaveEveritt`git ls-files --deleted -z | xargs -0 git rm`
请注意,此答案不适用于Windows:/
警惕名字中带有空格的文件
git add -u正如Cody所建议的那样是一种更简单,更安全的方式,没有意外删除文件的风险.
试图在Windows gitbash ..工作非常好.+1.
对于Windows尝试在您的配置中添加以下别名,而不使用Evan Moran上面所述的引号'remove =!git ls-files --deleted -z | xargs -0 git rm'
即使它可能适用于某些文件,也可以将其视为错误的答案.使用下面的"git add -u".这就是它的用途.
答案应该更新为@DaveEveritt的版本
@maazza请不要从根本上改变答案.这个是三岁.这一变化不应该得到批准.

3> Cody Caughla..:

您可以使用

git add -u

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

git commit -m "Deleted files manually"


请注意Google用户:它还会将修改后的跟踪文件添加到暂存区域.
仅当您刚删除文件并想立即暂存时才运行此命令.

4> Emil Sit..:

如果您只是运行:

git add -u

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

或者,如果您运行:

git commit -a

它将自动进行这些更改(以及任何其他更改)并提交它们.

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

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


"git ls-files --deleted | xargs git rm"是正确的答案!谢谢!
非常感谢'git ls-files --deleted | xargs git rm'!
commit -a首先执行"add -u"; 它将使用已知文件的任何更改来更新索引(无论是删除还是简单更改).您当然可以更具体,只添加/ rm您想要的文件.http://git.or.cz/gitwiki/GitFaq#Whyis.22gitrm.22nottheinverseof.22gitadd.22.3F可能会有所帮助.
"Update:.."下面的命令集就像一个魅力.谢谢!

5> Dustin..:

你可能正在寻找-A:

git add -A

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


在快速注释中,使用-u限制添加到跟踪文件,-a也包括未跟踪文件.只是想我会指出差异.

6> Saeb Amini..:

台数只已删除的文件:

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

您可以为首选命令集设置别名,以方便以后使用.


`git rm $(git ls-files --deleted)`这不是更方便(从[this]复制而来(http://stackoverflow.com/questions/492558/removing-multiple-files-from-a-git -repo-是具备的,已经被删除的,从盘)).
`git status | awk'/ deleted/{print $ 3}'| xargs git rm`是一种较短的方式.`grep | awk` ...只是说不.
@Saeb了解队列,但是`xargs`大约需要15分钟才能掌握.

7> Peaker..:
git rm test.txt

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


虽然它可以工作,但我经常发现自己只是通过`rm`删除大量文件,后来后悔了.
为什么这比做`git add -u`更糟?将添加的特定文件添加到提交中似乎更安全,而不是添加*ALL*更改.
实际上,根据问题的最后一行,这应该是最佳答案"我只想要一个删除git中所有文件的命令,这些文件也会从磁盘中删除."
@Ramsharan没有,因为它根本不会这样做.这会删除单个文件; OP明确要求"全部"删除文件.

8> 小智..:

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

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

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



9> Stephan Tual..:

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

git add -u 

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

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

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

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



10> SpoonMeiser..:

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

git commit -a

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


不,"-a"*是*可接受的开关,因为命令是*commit*."-A"是*add*但不是*commit*的开关.我看到您的建议编辑已被拒绝.
不知道为什么我被投票; git很好地识别已删除的文件,即使你没有使用git rm明确告诉它.

11> 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.



12> 小智..:

git add -u

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

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



13> Houssem Badr..:

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

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



14> Evan Moran..:

如果你想将它添加到你.gitconfig这样做:

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

然后你要做的就是运行:

git rma



15> Murphy Dange..:
git ls-files --deleted -z | xargs -0 git rm --cached

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

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

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



16> l3x..:

即使您有大量要处理的文件,以下内容也可以使用:

git ls-files --deleted | xargs git rm

您可能还想提交评论.

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



17> ilgam..:

试试吧.

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



18> Venkateswara..:

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

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

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



19> Xiong Chiami..:

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

根据Jeremy的回答,这就是我得到的:

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

    获取文件的状态.

    对于已删除的文件,请隔离该文件的名称.

    删除所有以#开头的行,以及其中包含"已删除"字样的状态行; 我不记得它是什么,确切地说,它不再存在,所以你可能不得不为不同情况修改它.我认为表达式分组可能是GNU特有的功能,所以如果你不使用gnutils,你可能需要添加多grep -v行.

    将文件传递给git rm.

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



20> DarkNeuron..:

如上所述

git add -u

将删除的文件分阶段删除,但也修改了文件以进行更新.

要取消暂存已修改的文件,您可以执行此操作

git reset HEAD 

如果你想保持你的提交有条不紊和干净.
注意:这也可能会删除已删除的文件,因此请小心使用这些通配符.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有