我有一个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 .工作方式相同的东西。
- 相关:stackoverflow.com/questions/1856654/…
- @seth,使用git rm并不总是方便的,可以从单独的工具、ide或文件管理器中删除。在删除/重命名文件时,Visual Studio for One可能会很麻烦。
- 呃,问别人为什么不使用git rm有点像问他们为什么不使用git vim或git cd。这是一件很愚蠢的事情,Git应该有一个内置的命令或别名来从临时文件中删除删除的文件,你不应该在So上查找它,也不应该在午休时阅读手册页。
- 瓦伦德的回答不是一个好办法。考虑一下cody建议的git add-u,这也是这个问题的答案:stackoverflow.com/questions/1402776/…
- 如何使用"rm"而不是"git rm"添加和提交删除的可能副本?
对于Git 1 x
这告诉Git自动准备跟踪文件——包括删除以前跟踪的文件。
对于Git 2
准备好整个工作树:
只准备当前路径:
- 请注意,这将添加所有已更改、跟踪的文件——已删除和更新。
- @Beanland,您只需要提供您想要修改的特定文件的路径,如果您不希望它得到所有文件的话。例如git add-u[路径]
- 另外,git add -u folder/在文件夹中运行此操作
- 嗯,这对我来说不适用于Git 1.8.1.msysgit.1在Windows7 32位上。也许我需要走git add -u *路?
- 请参阅@hotschke的git rm $(git ls-files --deleted)评论saeb的答案。
- 此命令不再适用于Git2.0。根据我在尝试时得到的错误信息,正确的命令是git add --update :/。
- 我也喜欢在没有新文件开始跟踪时,在发布git add -u之前使用git clean -f -d。
- 仅供参考:此答案来自stackoverflow.com/questions/1402776/…
- 这可能是人们到达这一页时问的问题,也可能是操作程序实际要问的问题,但它不能回答所问的确切问题。
- 仅供参考:如果同一个文件现在(添加)在不同的(添加的)目录中,使用此技术,某些删除的文件可能会显示为重命名。
1
| git ls-files --deleted -z | xargs -0 git rm |
可能是你要找的……它对我有效……
- 请注意,此答案在Windows上不起作用:/
- 对于Windows,请尝试在配置中添加以下别名,但不要使用上面Evan Moran'Remove=所述的引号!git ls文件--已删除-z xargs-0 git rm'
- 这实际上是正确的答案,因为-u还将修改过的跟踪文件添加到索引中。
- 注意文件名中有空格
- 在Windows Gitbash上尝试..工作得很好。+ 1。
- @maazza-如何处理名称中带有空格的文件?
- @戴维韦里特·埃多克斯
- 答案应更新为@daveveritt的版本。
- @请不要彻底改变答案。这个是三岁的。变更不应得到批准。
- 'git ls file s--删除了sed's/&40;*&41;/"1"/'xargs git rm',用于文件路径有空间的情况
- cody建议的git-add-u是一种更简单、更安全的方法,不会有意外删除文件的风险。
- 我认为我在使用上面提到的解决方案时遇到了问题,因为我有这么多删除的文件(丢弃的子项目),它字面上告诉我-bash: /usr/bin/git: Argument list too long。答案应该是@maxnanasy's/
- 在Github PowerShell上试用,效果很不错。
- 似乎在PowerShell上工作(不是Git Shell或其他东西,只是安装了Git.exe的通用PowerShell),而且工作正常!
- 无法处理名称中包含空格的文件。用git add -u代替,既短又安全。
- 你能详细说明一下这是干什么的吗?
- git ls-files --deleted生成所有状态为deleted的文件。对于每个删除的文件,git都会执行git rm。
- 在CentOS上完美工作
- 因为这是一个错误的答案,即使它可能适用于某些文件,所以拒绝投票。使用下面的"git add-u"。这就是它的目的。
- 这么简单的动作,这么难的解决方案……GIT方式
- Windows用户应该得到msys2或"git for windows",这样他们就可以运行一个正常的bash环境(和世界其他地方一样)并使用这个命令。
- 投反对票,因为解决方案危险且不稳定。很遗憾,手术室接受了。
你可以使用
将删除的文件添加到临时区域,然后提交它们
1
| git commit -m"Deleted files manually" |
- 请注意,谷歌用户:它也将修改后的跟踪文件添加到临时区域。
- 仅当您刚刚删除了这些文件并希望立即对其进行暂存时,才运行此命令。
- 我无法从bitback repo中删除文件]
如果你只是跑:
Git将更新其索引,以知道您删除的文件实际上应该是下一次提交的一部分。然后您可以运行"git commit"来签入该更改。
或者,如果你跑:
它将自动获取这些更改(以及任何其他更改)并提交它们。
更新:如果只想添加已删除的文件,请尝试:
1 2
| git ls-files --deleted -z | xargs -0 git rm
git commit |
- 是的,git commit -a会做我想做的,除了在某些情况下我有我不想提交的文件,所以我想手动准备提交。
- commit-a基本上首先执行"add-u";它将使用对已知文件的任何更改(无论是删除还是简单更改)来更新索引。当然,您可以更加具体,只添加/rm所需的文件。git.或.cz/gitwiki/…可能会有所帮助。
- "更新…"下面的命令集工作得很有魅力。谢谢!
- 非常感谢您提供的"git ls文件--已删除xargs git rm"!
- "git ls files--deleted xargs git rm"是正确答案!谢谢!
- "git ls files"不正确:它输出带有文本空格的文件名,这将中断下一部分。
- @Adam我已经用标志更新了语法,这些标志将在xargs中正确解析。
- git commit-a-u-m"commit message"将阶段化所有更改,包括删除,并在一行中全部提交
- 仅供参考:此答案来自stackoverflow.com/questions/1402776/…
你可能在找-a:
这类似于git add-u,但也添加了新文件。这大致相当于hg的addremove命令(尽管移动检测是自动的)。
- 简单地说,使用-u限制添加到跟踪文件,-a也将包括未跟踪的文件。我只是想指出不同之处。
- 在这个阶段,您还可以通过commit-a标志添加所有内容。
仅暂存已删除的文件:
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〕要掌握大约15分钟。
- git status | awk '/deleted/ {print $3}' | xargs git rm将是一种更短的方法。埃多克斯1〔10〕…只说不。
- 江户十一〔11〕不是更方便吗(抄自此)。
- xargs美元(或以上)的替代,如果你知道这儿没有宏大的战略。如果列表:git ls-files --deleted | while read f; do git rm $f; done巨冰
- 享受优雅的git status | awk '/deleted/{print"git rm" $3}' | sh位:
- (Saeb预览版的《神经答案:for x in ``git status | grep deleted | awk '{print $3}'``; do echo $x; done(replace向后的记号和单双酮);母猪的标记逃避不似乎工作。
- "安德鲁xargs冰可能更高效比一段A环的宏大的战略,因为它可以超过一个小时,它的每个参数executes git rm。两个数的限制,通过《题元git rm每两小时,它是executed,使用的-ngit ls-files --deleted | xargs -n 15 git rm选项:
- "ajedi32学会了一些新xargs -n甚winning:冰。谢谢!
- 注意,这是因为bash
- 介绍:这是从回答中添加stackoverflow.com /问题/ 1402776 / & hellip;
删除实际文件之前或之后。
- 虽然它可以工作,但我经常发现自己只是通过rm删除了大量的文件,后来又后悔了。
- 这是一个比接受的解决方案要小的解决方案
- 为什么这比执行git add -u更糟糕?似乎将删除的特定文件添加到提交中比添加所有更改更安全。
- 实际上,根据问题的最后一行,"我只需要一个命令,它可以从git中删除所有文件,这些文件也会从磁盘中删除。"
- @拉姆沙兰不,因为它根本不做这件事。这将删除一个文件;OP专门请求"全部"删除的文件。
- @亚当,你说得对。此单个命令无法删除"所有"已删除的文件。对于多个文件,必须多次运行此命令。但您可以使用通配符删除多个文件。
- @Ramsharan不,这就是重点-在几乎所有情况下,您不能简单地使用通配符(没有匹配的通配符)。这就是为什么主要的答案要复杂得多。
- @亚当,主要的事情是我通常在我的项目中使用"git-rm-filename"或"git-rm-folder/*"。通常对我来说已经足够了。
- 我不敢相信这一回应得到了如此多的赞成票。它所做的只是给出了从手册中删除一个文件的基本命令。这个问题问的是"类似于git add ."的问题,它会将所有新的和修改过的文件添加到舞台上。"这根本不能回答这个问题。
- 仅供参考:此答案来自stackoverflow.com/questions/1402776/…
- 当文件名中有空格时,这不起作用。
通过使用git-add和"--all"或"--update"选项,您可能会得到比您想要的更多。新的和/或修改过的文件也将添加到索引中。我有一个bash别名设置,用于在不接触其他文件的情况下从git中删除已删除的文件:
1
| alias grma='git ls-files --deleted -z | xargs -0 git rm' |
从文件系统中删除的所有文件都将作为已删除文件添加到索引中。
这并不重要,但我不同意选择的答案:
…如果工作树中的相应文件已被删除,则将从索引中删除文件,但它也将暂存被跟踪文件的修改后的新内容。
1
| git rm $(git ls-files --deleted) |
…另一方面,只会对被跟踪的已删除文件进行rm。
所以我认为后者是更好的选择。
如果这是唯一的改变,你可以简单地做
提交所有更改。其中包括已删除的文件。
- 不知道为什么我投了反对票;Git很好地识别了被删除的文件,即使你没有使用Git-RM明确地告诉它。
- 你被否决是因为"-a"不是一个可以接受的开关,它是"-a"。编辑您的答案。
- 不,"-a"是可接受的开关,因为命令是commit。-"是添加而不是提交的开关。我看到你建议的编辑已经被拒绝了。
- 唯一对我有用的东西
- 如果只提交已删除的文件,请添加开关--allow empty
- err,实际上--allow empty仅在执行git rm时才需要--cached
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——更新只匹配索引中已跟踪的文件,而不是工作树。这意味着它将永远不会准备新文件,但它将准备修订的跟踪文件的新内容,并且如果工作树中的相应文件已被删除,它将从索引中删除文件。
如果没有,则默认为".",换句话说,更新当前目录及其子目录中的所有跟踪文件。
- 《顶级voted回答说git add -u已经使用。在美国能源部的所有其他的东西在你的答案来,从"文件吗?你要链接的文件和其它信息。如果它。
这个简单的解决方案对我来说很好:
1
| git rm $(git ls-files --deleted) |
- 这不工作,如果有空间的路径
- 我想你应该总是使用Git壳对你当前的工作目录
- 这是很好的和简单的工作,但不与folders递归。
- "我认为这是behnazchangizi,stackoverflow.com /问题/ 1054044 / & hellip;
- "pvdl槽accepted空间的路径问题,我们specefic冰
如果要将其添加到您的.gitconfig中,请执行以下操作:
1 2
| [alias]
rma = !git ls-files --deleted -z | xargs -0 git rm |
然后你要做的就是跑步:
- 从命令行git config --global alias.rmd '!git ls-files --deleted -z | xargs -0 git rm'鸭
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" |
- git add -好&;&;m的Git提交你的承诺"这是我的工作在Windows 7使用Git Bash Shell命令。
- 下面的命令我工作在Windows 7使用Git Bash Shell命令:$ git add -好&;&;Git提交"remove产权档案"[硕士] 58c41ac remove产权文件1文件缺失了,(9)。然后,这些承诺两推两个远程数据库的变化有:$ git push跑的起源。计10分,完成目标。
即使您有许多文件要处理,以下内容也可以工作:
1
| git ls-files --deleted | xargs git rm |
您可能还需要提交一个注释。
有关详细信息,请参见:有用的Git脚本
如上所述
将删除的文件分阶段删除,但也将修改的文件分阶段更新。
要取消对修改文件的分页,可以执行以下操作
如果您希望保持提交的组织性和干净性。
注意:这也可能会取消对已删除文件的保存,因此请小心使用这些通配符。
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"按钮。它也增加了所有。
在"舞台改变"之后,我做了"承诺"…
所以我的工作目录又是干净的。
- 好吧,使用图形用户界面是欺骗,哈哈!但在GUI设计器满足您需求的情况下,速度更快。很高兴知道如何修补"引擎盖下面是什么"。
- 仅供参考:此答案来自stackoverflow.com/questions/1402776/…
您只能使用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' |
当已删除的文件路径有空间时,这很有用
迄今为止,我发现最灵活的解决方案是
并选择所有要暂存的已删除文件。
(注意,我通常在git中执行所有命令行,但git处理删除的文件有点笨拙)。
- git cola什么的吗?
- 一个GUI(git-cola.github.io Git)。
- 通配符不工作.我有git add -u path/to/my/deleted-files-pattern-*.yml婊子这是最好的答案(我不缺少两级全删除档案,但偶取50(100)。