245

我删除了一些文件,git status 显示如下。

我已经承诺并推动了。

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
4

16 回答 16

662
git add -u 

更新您的所有更改

于 2012-09-01T16:48:11.220 回答
92

非常谨慎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),但在 start 的行上# deleted:,它会去掉 the#和 thedeleted:并打印剩下的内容;xargs收集参数并将它们提供给git rm命令。这适用于任意数量的文件,无论名称是否相似。

于 2011-05-14T20:22:37.517 回答
54

ByScripts 答案的另一个版本是

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

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

它也可用于仅添加已修改的文件。

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

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

于 2013-07-04T18:40:24.273 回答
37

更新您所做的所有更改:

git add -u

删除的文件应从未暂存(通常为红色)变为暂存(绿色)。然后提交以删除已删除的文件:

git commit -m "note"
于 2014-04-23T00:45:41.927 回答
13

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

如果您只想删除已删除的文件,而不是暂存任何修改过的文件,我认为您应该使用ls-files带有--deleted选项的参数(无需使用正则表达式或其他复杂的参数/选项):

git ls-files --deleted | xargs git rm
于 2013-01-11T12:46:36.757 回答
8

是的,git rm <filename>将暂存文件的已删除状态,其中<filename>可能是全局模式:

$ 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暂存所有更改,包括所有已删除的文件,然后提交。

于 2011-05-14T20:06:43.620 回答
7

当我删除了很多未暂存以提交的文件时,您可以git rm将它们全部显示在一个节目中:

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

正如问题回答者所提到的,小心git rm.

于 2012-07-08T08:15:31.850 回答
5

试试这个:

 git rm `git ls-files -d`
于 2015-10-01T11:03:30.130 回答
3

您可以使用

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

在您手动删除文件之后。

于 2014-02-25T22:17:27.653 回答
3

您可以创建一个 shell 脚本,该脚本将在运行时删除所有文件:

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

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

于 2014-06-26T01:32:56.343 回答
2
git status | sed 's/^#\s*deleted:\s*//' | sed 's/^#.*//' | xargs git rm -rf
于 2012-11-12T02:12:25.940 回答
2

在我删除它们并遇到这个简洁的命令后,我的仓库中出现了这个幽灵文件问题!

git add -A

git add -a它与和组合基本相同git add -u,但区分大小写。我是从这个很棒的链接获得的(这个链接现在指向 archive.org 上的版本,因为截至 2016 年 6 月,原版已转换为垃圾邮件/网络钓鱼页面)

于 2013-08-28T15:10:17.490 回答
2

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

git ls-files --deleted -z | xargs -0 git rm

此查询列出了所有已删除的文件并将它们从您的 git 存储库中删除。希望能帮助到你。

于 2013-09-29T12:34:09.123 回答
2
git add -u .

git add --update .
于 2015-08-17T01:47:48.993 回答
1

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

git clean -fd
于 2013-04-09T18:51:48.467 回答
0

以下是如何检测已删除文件并将其删除作为下一次提交的一部分。该线程上的所有解决方案都有不同的优点。下面的这个解决方案专门处理文件名中带有空格的问题。

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 "/path to a folder/path to a file" 的内容,仅当路径名中有空格时才会发生

awk '/^.D .*$/ {print $0}'

仅匹配以“ D ”开头的行

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

从每个字符串的前面删除“ D ”

tr -d '"'

删除引号,如果有的话

xargs -I {} git rm '{}'

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

于 2015-03-21T19:26:07.940 回答