如何在Git仓库中删除多个已删除的文件

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

更新所有更改

git rm .非常谨慎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通配符,因为这些文件不存在,但你可以使用(至less在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: #deleted:并打印剩下的东西; xargs收集参数并将它们提供给git rm命令。 这适用于任何数量的文件,而不pipe名称中的相似性(或不相似性)。

ByScripts答案的另一个版本是

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

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

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

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

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

更新您所做的所有更改:

 git add -u 

被删除的文件应该从非挂起(通常是红色)变为挂起(绿色)。 然后提交删除已删除的文件:

 git commit -m "note" 

如果你不关心分段修改的文件,最好的解决方法是使用git add -umshameers和/或pb2q所说

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

 git ls-files --deleted | xargs git rm 

是的, git rm <filename>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 -agit commit -a做到这一点,如果你想。

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

当我有很多文件,我已经删除了未提交的提交,你可以在一个表演中,他们都与:

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

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

尝试这个:

  git rm `git ls-files -d` 

您可以使用

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

在手动删除文件之后。

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

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

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

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

如果你想通过使用“git rm”来删除它们。 这就是我所做的:

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

这个查询列表中已经被删除的所有文件,并从你的git仓库中删除它们。 希望能帮助到你。

 git add -u . git add --update . 

内置的清洁function也可以帮助…

 git clean -fd 

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

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

确保你用git的–dry-run选项testing了这个选项,然后用下面的代码运行它:

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

说明:

 git status --porcelain 

这会打印出类似于D“/文件夹/path的path”,这只有在path名称中有空格时才会发生

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

仅匹配以“D”开头的行

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

删除每个string前面的“D”

 tr -d '"' 

删除引号,如果有的话

 xargs -I {} git rm '{}' 

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

我删除了这个问题后,在我的回购库中出现了这个鬼文件,碰到了这个整洁的命令!

git add -A

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