我有一个 Git 存储库,我使用 rm
(not git rm
)删除了四个文件,我的 Git 状态如下所示:
# deleted: file1.txt
# deleted: file2.txt
# deleted: file3.txt
# deleted: file4.txt
如何从 Git 中删除这些文件,而无需手动检查并添加每个文件,如下所示:
git rm file1 file2 file3 file4
理想情况下,如果可能的话,我正在寻找与 git add .
相同的工作方式。
git rm
并不总是很方便,删除可能来自单独的工具、IDE 或文件管理器。删除/重命名文件时,Visual Studio 可能会很痛苦。
git rm
有点像问他们为什么不使用 git vim
或 git cd
。这是一件愚蠢的事情,git应该有一个内置的命令或别名来从暂存中删除已删除的文件,并且您不必在SO上查找它或在午休时间阅读手册页。
对于 Git 1.x
$ git add -u
这告诉 git 自动暂存跟踪的文件——包括删除以前跟踪的文件。
对于 Git 2.0
暂存整个工作树:
$ git add -u :/
仅暂存当前路径:
$ git add -u .
git ls-files --deleted -z | xargs -0 git rm
可能是您正在寻找的东西..它对我有用..
git ls-files --deleted -z | xargs -0 git rm
您可以使用
git add -u
将删除的文件添加到暂存区,然后提交它们
git commit -m "Deleted files manually"
如果您只是运行:
git add -u
git 将更新其索引以知道您已删除的文件实际上应该是下一次提交的一部分。然后您可以运行“git commit”来签入该更改。
或者,如果您运行:
git commit -a
它将自动接受这些更改(以及任何其他更改)并提交它们。
更新:如果您只想添加已删除的文件,请尝试:
git ls-files --deleted -z | xargs -0 git rm
git commit
git commit -a
会做我想做的事,除了在某些情况下我有不想提交的文件,所以我想手动准备提交。
您可能正在寻找-A:
git add -A
这类似于 git add -u,但也会添加新文件。这大致相当于 hg 的 addremove
命令(尽管移动检测是自动的)。
仅暂存已删除的文件:
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您喜欢的命令集以方便日后使用。
xargs
大约需要 15 分钟才能掌握。
git status | awk '/deleted/ {print $3}' | xargs git rm
将是一种更短的方法。 grep | awk
... 说不。
git rm $(git ls-files --deleted)
不是更方便(从 this 复制)。
git ls-files --deleted | while read f; do git rm $f; done
xargs
对于一个巨大的列表可能比 while 循环更有效,因为它每次执行 git rm
时都会传递多个参数。要限制每次执行时传递给 git rm
的参数数量,请使用 -n
选项:git ls-files --deleted | xargs -n 15 git rm
git rm test.txt
在您删除实际文件之前或之后。
rm
就删除了大量文件,后来又后悔了。
git add -u
更糟糕?将已删除的特定文件添加到提交中似乎比添加 ALL 更改更安全。
通过使用带有 '--all' 或 '--update' 选项的 git-add,你可能会得到比你想要的更多的东西。新的和/或修改过的文件也将被添加到索引中。当我想从 git 中删除已删除的文件而不触及其他文件时,我有一个 bash 别名设置:
alias grma='git ls-files --deleted -z | xargs -0 git rm'
已从文件系统中删除的所有文件都将作为已删除添加到索引中。
并不是说它真的很重要,但我不同意选择的答案:
git add -u
... 如果工作树中的相应文件已被删除,则将从索引中删除文件,但它也会暂存已修改的跟踪文件的新内容。
git rm $(git ls-files --deleted)
...另一方面,只会 rm 跟踪的已删除文件。
所以我认为后者是更好的选择。
如果这些是唯一的变化,你可以简单地做
git commit -a
提交所有更改。这将包括已删除的文件。
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.
git 添加 -u
-u --update 只匹配索引中已经跟踪的文件而不是工作树。这意味着它永远不会暂存新文件,但它将暂存已修改的跟踪文件的新内容,并且如果工作树中的相应文件已被删除,它将从索引中删除文件。
如果没有给出,默认为“。”;换句话说,更新当前目录及其子目录中的所有跟踪文件。
git add -u
。您的答案中的所有其他内容来自哪里,文档?如果有,您应该链接到文档并对其进行块引用。
这个简单的解决方案对我来说很好:
git rm $(git ls-files --deleted)
如果您想将其添加到您的 .gitconfig
中,请执行以下操作:
[alias]
rma = !git ls-files --deleted -z | xargs -0 git rm
然后你所要做的就是运行:
git rma
git config --global alias.rmd '!git ls-files --deleted -z | xargs -0 git rm'
git ls-files --deleted -z | xargs -0 git rm --cached
这将删除之前由 git 跟踪的所有已删除文件,并处理文件名中包含空格的情况。
根据您的 POSIX 变体,您可能需要使用 xargs -0 -r
:这将导致 xargs
在管道空内容时正常退出。
编辑:--cached
和 --deleted
标志一起使用,以防止意外删除尚未删除的文件。
git rm $(git ls-files -d)
删除 git ls-files
命令列出的所有文件(-d 仅显示已删除的文件)。不适用于文件名或路径中有空格但易于记忆的文件
告诉命令自动暂存已修改和删除的文件,但您没有告诉 Git 的新文件不受影响:
-a --全部
git add . && git commit -m -a "Your commit"
或者
git add --all && git commit -m "Your commit"
如前所述
git add -u
暂存已删除的文件以进行删除,同时还修改了文件以进行更新。
要取消暂存修改过的文件,您可以执行
git reset HEAD <path>
如果你想保持你的提交有条理和干净。注意:这也可以取消暂存已删除的文件,因此请小心使用这些通配符。
即使您有很多文件要处理,以下操作也将起作用:
git ls-files --deleted | xargs git rm
您可能还想发表评论。
有关详细信息,请参阅:Useful Git Scripts
请使用 -t
查看实际运行的是哪个命令
我只是调整了 Virender 的答案来做同样的事情:
git ls-files --deleted -z | xargs -t -0 git rm
git-add 的任何标志都不会只暂存已删除的文件;如果您修改的只是已删除的文件,那么您很好,否则,您需要运行 git-status 并解析输出。
根据杰里米的回答,这就是我得到的:
git status | sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
获取文件状态。对于已删除的文件,隔离文件名。删除所有以#s 开头的行,以及其中包含“已删除”一词的状态行;我不记得它到底是什么,而且它不再存在了,所以你可能需要针对不同的情况进行修改。我认为表达式的分组可能是 GNU 特有的功能,所以如果你不使用 gnutils,你可能需要添加多个 grep -v 行。将文件传递给 git rm。
现在将其粘贴在 shell 别名中...
git commit -m 'commit msg' $(git ls-files --deleted)
在我删除文件后,这对我有用。
我需要相同的并使用 git gui “stage changed”按钮。它还添加了所有内容。
在“阶段改变”之后,我做出了“承诺”......
所以我的工作目录又干净了。
您只能使用 git add -u <filenames>
暂存已删除的文件。
例如,如果您删除了文件 templates/*.tpl
,则使用 git add -u templates/*.tpl
。
-u
是必需的,以便引用存储库中存在但工作目录中不再存在的文件。否则,git add
的默认设置是在工作目录中查找文件,如果您指定已在工作目录中删除的文件,它将不会找到它们。
为暂存已删除文件添加系统别名作为命令 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
。
(另一种变体)
我想从磁盘文件中删除所有已删除的文件,但从一个特定文件夹中删除,而其他文件夹保持不变。以下对我有用:
git ls-files --deleted | grep <folder-name> | xargs git rm
就像是
git status | sed -s "s/^.*deleted: //" | xargs git rm
可以做到。
git diff --diff-filter=D --name-only | xargs git rm
对于视觉工作室项目
'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm'
当删除的文件路径有空间时,这很有用
简直了
git add . && git commit -m "the message for commit" && git push
从 Repo 中删除所有以 .log 结尾的文件,但不删除本地存储
git rm --cached $(git ls-files | grep "\.log$")
不定期副业成功案例分享
git add -u folder/
在文件夹中运行此操作