如何删除Git存储库中的多个已删除文件

时间:2011-05-14 20:00:19

标签: git git-rm

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

16 个答案:

答案 0 :(得分:619)

git add -u 

更新所有更改

答案 1 :(得分:91)

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命令。无论名称中的相似性(或不相似性)如何,这都适用于任意数量的文件。

答案 2 :(得分:50)

ByScripts答案的另一个版本是

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

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

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

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

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

答案 3 :(得分:35)

更新您所做的所有更改:

git add -u

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

git commit -m "note"

答案 4 :(得分:12)

如果您不关心暂存已修改文件的最佳解决方案,请使用 mshameers 和/或 pb2q 所述的git add -u

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

git ls-files --deleted | xargs git rm

答案 5 :(得分:8)

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

答案 6 :(得分:7)

如果我删除了许多未提交提交的文件,您可以在一个节目中git rm将它们全部用于:

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

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

答案 7 :(得分:5)

试试这个:

 git rm `git ls-files -d`

答案 8 :(得分:3)

您可以使用

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

手动删除文件后。

答案 9 :(得分:3)

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

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

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

答案 10 :(得分:2)

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

答案 11 :(得分:2)

如果要使用“git rm”删除所有这些内容。这就是我的工作:

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

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

答案 12 :(得分:2)

git add -u .

git add --update .

答案 13 :(得分:1)

内置的清洁功能也很有用......

git clean -fd

答案 14 :(得分:1)

在我删除它们之后,我的回购中出现了这个鬼文件的问题,并且遇到了这个简洁的命令!

git add -A

它与git add -agit add -u基本相同,但它区分大小写。我是从this awesome link获得的(此链接指向archive.org上的版本,因为原始版本已于2016年6月转换为垃圾邮件/网上诱骗页面)

答案 15 :(得分: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“/文件夹/文件路径的路径” 只有当路径名中有空格时才会发生这种情况

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

仅匹配以“D”开头的行

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

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

tr -d '"'

删除引号,如果有的话

xargs -I {} git rm '{}'

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