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

shi*_*hin 233 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
Run Code Online (Sandbox Code Playgroud)

如果我使用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
Run Code Online (Sandbox Code Playgroud)

小智 627

git add -u 
Run Code Online (Sandbox Code Playgroud)

更新所有更改

  • 有魅力.当您看到类似"git status | sed -n'/ ^#*已删除:/ s /// p'| xargs git rm"之类的东西时,作为这种简单而频繁的要求的建议解决方案,那么您知道更好的解决方案是,或者很快就会到来. (30认同)
  • @kelin:来自git docs(https://git-scm.com/docs/git-add):" - u --update更新索引,它已经有一个匹配<pathspec>的条目.这个删除以及修改索引条目以匹配工作树,但不添加新文件.如果在使用-u选项时没有给出<pathspec>,则更新整个工作树中的所有跟踪文件(旧版本的Git用于将更新限制为当前目录及其子目录.)" (3认同)
  • 作者问如何删除文件,为什么添加文件是正确答案? (2认同)

Jon*_*ler 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
Run Code Online (Sandbox Code Playgroud)

您不能使用shell通配符,因为文件不存在,但您可以使用(至少在Bash中):

git rm modules/welcome/language/{english,french,german,norwegian}/kaimonokago_lang.php
Run Code Online (Sandbox Code Playgroud)

或者考虑:

git status | sed -n '/^# *deleted:/s///p' | xargs git rm
Run Code Online (Sandbox Code Playgroud)

这取得了输出git status,默认情况下不打印任何东西(sed -n),但是在开始的行上# deleted:,它摆脱#deleted:和打印剩下的东西; xargs收集参数并将它们提供给git rm命令.无论名称中的相似性(或不相似性)如何,这都适用于任意数量的文件.

  • `git diff --diff-filter = D --name-only -z | xargs -0 git rm`是一种比尝试解析面向用户的"git status"更可靠的方法,并且不能保证在未来的版本中保持稳定. (109认同)
  • 请注意,还有"git ls-files --deleted" (8认同)
  • 你*可以*使用通配符(虽然你可能需要转义它们),git将匹配索引中的路径,而不仅仅是工作树中的路径,因此它们在文件系统中不存在并不重要. (6认同)
  • 所以,`git ls-files --deleted | xargs git rm` 为我解决了这个问题。 (2认同)

Vij*_*y C 50

ByScripts答案的另一个版本是

git rm $(git ls-files --deleted)
Run Code Online (Sandbox Code Playgroud)

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

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

git add $(git ls-files --modified)
Run Code Online (Sandbox Code Playgroud)

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

  • 价格低廉,状态被删除或修改的`git ls-files`非常有用. (2认同)

Azi*_*lto 35

更新您所做的所有更改:

git add -u
Run Code Online (Sandbox Code Playgroud)

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

git commit -m "note"
Run Code Online (Sandbox Code Playgroud)


ByS*_*pts 12

如果你不关心分期修改文件的最佳解决方案是使用git add -u如说mshameers和/或pb2q.

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

git ls-files --deleted | xargs git rm
Run Code Online (Sandbox Code Playgroud)


Ben*_*mes 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
#       ...
Run Code Online (Sandbox Code Playgroud)

然后,你可以提交.

git commit -a 如果你愿意的话,我会一气呵成.

您还可以使用git add -u暂存所有更改,包括所有已删除的文件,然后提交.

  • 似乎`git add -u`正是我们正在寻找的 - 如果你做了很多删除,那么想要提交所有删除,这似乎是最简单和最"标准"的方式(意思是,没有特定于案例)全局或复杂的shell解析为xargs).是否有理由我们不想使用它,除了它一次添加所有更改的事实? (5认同)

小智 7

当我有很多我已经删除但未提交的文件时,你可以git rm在一个节目中使用:

for i in `git status | grep deleted | awk '{print $3}'`; do git rm $i; done
Run Code Online (Sandbox Code Playgroud)

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


elu*_*dom 5

试试这个:

 git rm `git ls-files -d`
Run Code Online (Sandbox Code Playgroud)