从Git仓库和远程GitHub上完全删除文件

我不小心添加了一个图像的文件夹,并提交。 然后,我做了一个更多的承诺。 然后我使用git rm -f ./images删除了这些文件,然后再次提交。

现在,我在这个分支(主)做了更多的承诺。 在我的HEAD,我没有./static/images文件夹。

由于这个原因,我的回购规模增加了很多。 我怎样才能完全删除这些blob? 我想从我的远程GitHub回购中删除它。

这就是你要找的: 忽略不会删除文件 。 我build议你阅读那个页面,但是这里有特定的命令来使用:

 git filter-branch --index-filter \ 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD 

另外,要从git创build的caching中删除所有已删除的文件,请使用:

 rm -rf .git/refs/original/ && \ git reflog expire --all && \ git gc --aggressive --prune 

你可以find更多的关于最后一个命令的信息,以及一个脚本,在一个单一的行动,你可以做任何事情,在这里: git:从历史中永远删除文件或文件夹 。

另有很多解释的链接: 删除敏感数据 。

[编辑]此外,看到这个StackOverflow的问题: 删除敏感的文件和他们从Git的历史提交 。

(在上面链接的问题中,从natacado的答案中复制的命令)。如果你已经从工作副本中删除了这些文件,下面的代码应该可以工作。 找出添加不需要的文件的提交哈希。 然后做:

 git filter-branch --index-filter \ 'git update-index --remove filename' <introduction-revision-sha1>..HEAD git push --force --verbose --dry-run git push --force 

您可以重新绑定整个分支,并删除添加图像的提交以及删除它们的提交。

 git rebase -i master 

您将看到提交列表。 删除你想删除stream氓提交的行。 (“dd”在vim中删除一行,默认编辑器,然后用ZZ保存)

悬挂的提交将在自然垃圾收集过程中被清除,这个过程可以用Darhuuk的回答给出的命令强制执行。

编辑:即使您已经推送到远程存储库,这将工作,但你必须用–force推。 (这同样适用于git filter-branch解决scheme)。

请注意,这将是非常烦人的人从你的分支拉。 他们应该咨询“从上游的rebase”恢复 。


大概你原来的意外添加图像是你想保留的提交的一部分。 在这种情况下,您需要在重新绑定期间编辑提交以拆分您希望保留的部分。 你可以通过用“e”(用于编辑)replace该提交的“rebase -i”列表中的“pick”来做到这一点。 rebase进程将停止在这里,你可以拆分提交“git commit –amend”。

我基本上重复了这个Windows格式化警告 的答案 ,只有这样才不会因为评论而丢失。

请注意使用双引号而不是单引号,因为它取决于您使用的shell如何分析string。

单线:

 git filter-branch --index-filter "git rm -r --cached --ignore-unmatch <file/dir>" HEAD 

多行:

 git filter-branch --index-filter \ "git rm -r --cached --ignore-unmatch <file/dir>" HEAD