如何删除多个已删除的文件在Git仓库

我删除了一些文件,git状态如下图所示。

我已经承诺并努力了。

GitHub仍然在存储库中显示已删除的文件。如何删除GitHub存储库中的文件?

# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    modules/welcome/language/english/kaimonokago_lang.php
#   deleted:    modules/welcome/language/french/kaimonokago_lang.php
#   deleted:    modules/welcome/language/german/kaimonokago_lang.php
#   deleted:    modules/welcome/language/norwegian/kaimonokago_lang.php

如果我使用git rm,它会给出以下结果。

usage: git rm [options] [--] <file>...


-n, --dry-run         dry run
-q, --quiet           do not list removed files
--cached              only remove from the index
-f, --force           override the up-to-date check
-r                    allow recursive removal
--ignore-unmatch      exit with a zero status even if nothing matched
165342 次浏览

是的,git rm <filename>将阶段性文件的删除状态,其中<filename>可以是一个glob模式:

$ git rm modules/welcome/language/*/kaimonokago_lang.php
rm modules/welcome/language/english/kaimonokago_lang.php
rm modules/welcome/language/french/kaimonokago_lang.php
rm modules/welcome/language/german/kaimonokago_lang.php
rm modules/welcome/language/norwegian/kaimonokago_lang.php


$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    modules/welcome/language/english/kaimonokago_lang.php
#       ...

然后,你就可以承诺了。

如果你愿意,git commit -a将一次性完成此操作。

你也可以使用git add -u来执行所有的更改,包括所有被删除的文件,然后提交。

git rm .要非常谨慎;可能会比你想要的多。当然,你可以恢复,但不这样做会更简单。

最简单的是:

git rm modules/welcome/language/english/kaimonokago_lang.php \
modules/welcome/language/french/kaimonokago_lang.php \
modules/welcome/language/german/kaimonokago_lang.php \
modules/welcome/language/norwegian/kaimonokago_lang.php

你不能使用shell通配符,因为文件不存在,但你可以使用(至少在Bash中):

git rm modules/welcome/language/{english,french,german,norwegian}/kaimonokago_lang.php

或者考虑:

git status | sed -n '/^# *deleted:/s///p' | xargs git rm

它接受git status的输出,默认情况下不打印任何内容(sed -n),但在以# deleted:开头的行中,它会删除#deleted:,并打印剩下的内容;xargs收集参数并将它们提供给git rm命令。这适用于任何数量的文件,而不管名称的相似性(或不相似性)。

当我有很多已删除的文件未被提交时,你可以在一个show中git rm它们:

for i in `git status | grep deleted | awk '{print $3}'`; do git rm $i; done

正如回答问题的人提到的,要小心git rm

git add -u

更新所有更改

git status | sed 's/^#\s*deleted:\s*//' | sed 's/^#.*//' | xargs git rm -rf

如果你不关心暂存修改过的文件,最好的解决方案是使用mshameers和/或pb2q所说的git add -u

如果你只是想删除已删除的文件,但不执行任何修改过的文件,我认为你应该使用ls-files参数和--deleted选项(不需要使用regex或其他复杂的参数/选项):

git ls-files --deleted | xargs git rm

内置的清洁功能也很有帮助…

git clean -fd

ByScripts的另一个版本的答案是

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

这只会从git中删除已删除的文件。

它还可以用于添加仅修改的文件。

git add $(git ls-files --modified)

这些命令也适用于windows的gitbash。

我有这个问题的幽灵文件出现在我的回购后,我删除了他们,遇到了这个整洁的命令!

git add -A

它本质上与git add -agit add -u的组合相同,但它区分大小写。我从这个很棒的链接得到它(这个链接指向archive.org上的版本,因为原始版本在2016年6月已经转换为垃圾邮件/钓鱼页面)

如果你想使用“git rm”删除所有这些文件。这就是我所做的:

git ls-files --deleted -z | xargs -0 git rm
这个查询列出了所有已经被删除的文件,并从你的git存储库中删除它们。

你可以使用

git commit -m "remove files" -a
git push

在你手动删除文件后。

更新您所做的所有更改:

git add -u
删除的文件应该从未分级(通常是红色)变为分级(绿色)。 然后提交删除已删除文件:

git commit -m "note"

你可以创建一个shell脚本,它会在运行时删除你所有的文件:

git status | grep deleted | awk '{print "git rm " $3;}' > ../remove.sh

创建的脚本是remove.sh,它包含了git rm命令的完整列表。

下面介绍如何检测已删除的文件,并将其删除作为下次提交的一部分。这篇文章中的所有解决方案都有不同的优点。下面的解决方案专门处理文件名中有空格的问题。

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm '{}'

在运行之前,请确保使用git的——dry-run选项进行测试:

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm --dry-run '{}'

解释:

git status --porcelain
这将打印出类似于 D "/文件夹路径/文件路径" 只有在路径名

中有空格时才会发生这种情况
awk '/^.D .*$/ {print $0}'

只匹配以“D”开头的行

sed 's/ D \(.*\)/\1/'

从每个字符串的前面去掉“D”

tr -d '"'

删除引号,如果有的话

xargs -I {} git rm '{}'

定义文件名变量为{} 在git rm下运行文件名,用单引号括起来,以确保它支持文件名中有空格

git add -u .


git add --update .

试试这个:

 git rm `git ls-files -d`