我删除了一些文件,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要非常谨慎。可能会比你想要的多。当然,你可以恢复,但不这样做会更简单。
最简单的是:
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 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 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执行所有的更改,包括所有被删除的文件,然后提交。