我删除了一些文件,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

当前回答

git add -u 

更新所有更改

其他回答

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

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

最简单的是:

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

试试这个:

 git rm `git ls-files -d`

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

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下运行文件名,用单引号括起来,以确保它支持带空格的文件名。

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

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

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