关于git rm:如何删除Git存储库中的多个已删除文件

How to remove multiple deleted files in Git repository

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

我已经承诺和推动了。

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

1
2
3
4
5
6
7
8
9
# 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,它给出了以下内容。

1
2
3
4
5
6
7
8
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


1
git add -u

更新所有更改


git rm .要非常小心;它可能会删除超过您想要的。当然,你可以恢复,但不必这样做更简单。

最简单的方法是:

1
2
3
4
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中):

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

或者考虑:

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

它接受git status的输出,默认情况下不打印任何内容(sed -n),但在启动# deleted:的行上,它去掉#deleted:并打印剩余的内容;xargs收集参数并提供给git rm命令。这适用于任何数量的文件,不管名称的相似性(或不同性)。


另一个版本的byscripts答案是

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

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

它也可以用于只添加修改过的文件。

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

这些命令也适用于Gitbash for Windows。


更新您所做的所有更改:

1
git add -u

删除的文件应从未分页(通常为红色)更改为分级(绿色)。然后提交以删除已删除的文件:

1
git commit -m"note"


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

如果您只想删除已删除的文件,而不准备任何已修改的文件,我认为您应该将ls-files参数与--deleted选项一起使用(不需要使用regex或其他复杂参数/选项):

1
git ls-files --deleted | xargs git rm


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

1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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阶段化所有更改,包括所有已删除的文件,然后提交。


当我删除了许多未归档的文件供提交时,您可以在一个显示中使用以下命令来删除这些文件:

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

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


试试这个:

1
 git rm `git ls-files -d`


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

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

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


你可以用

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

手动删除文件后。


1
2
3
git add -u .

git add --update .


如果您想使用"git rm"删除所有文件。我就是这样做的:

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

此查询列出所有已删除的文件,并将它们从Git存储库中删除。希望有帮助。


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


我删除了这些鬼文件后,在我的报告中出现了这个问题,并且遇到了这个整洁的命令!

埃多克斯1〔17〕

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


内置的清洗功能也有助于…

1
git clean -fd


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

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

在使用以下方法运行之前,请确保使用git的--dry-run选项对此进行测试:

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

说明:

1
git status --porcelain

这个打印出d"/文件夹路径/文件路径"只有当路径名中有空格时才会发生这种情况

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

仅匹配以"d"开头的行

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

从每根绳子的前面取下"D"

1
tr -d '"'

删除引号(如果有)

1
xargs -I {} git rm '{}'

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