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

我不小心添加了一个图片文件夹并提交了。然后,我又提交了一个。 然后我使用 git rm -f ./images删除这些文件并再次提交。

现在,我已经在那个分支(主)中做了更多的承诺。我脑子里没有 ./static/images文件夹。

因此,我的回购规模增加了很多。我怎样才能完全去除这些斑点?我还想把它从我的远程 GitHub 回收站移除。

66589 次浏览

这就是你要找的: ignoring doesn't remove a file。我建议你阅读这一页,但这里有一个具体的命令要使用:

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

此外,要从缓存 git 创建中删除所有已删除的文件,请使用:

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

您可以在这里找到关于最后一个命令的更多信息,以及一个脚本,它可以在一个操作中完成您想要的所有事情,这里是: Git: 从历史记录中永久删除文件或文件夹

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

[ Edit ] 另外,请参见这个 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

您将看到一个提交列表。删除要删除的带有流氓提交的行。(“ dd”删除缺省编辑器 vim 中的一行。然后用 ZZ 保存)

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

编辑: 即使您已经推送到远程存储库,这也可以工作,但是您必须使用—— force 进行推送。(这同样适用于 git 过滤器-分支解决方案)。

请注意,这将是非常恼人的任何人谁已经从您的分支。他们应该咨询 “从上游基地恢复”


想必您最初偶然添加的图像是您希望保留的提交的一部分。在这种情况下,您需要在 rebase 期间编辑提交,以拆分您希望保留的部分。您可以通过将“ rebase-i”列表中的“ pick”替换为“ e”(用于编辑)来实现这一点。Rebase 进程将在这里停止,您可以使用“ git commit —— Amendment”分割提交。

我实际上是在重复 答案和这个 Windows 格式警告的组合,只有这样它才不会作为注释丢失。

Note the use of double-quotes rather than single quotes, because it depends on the shell that you're using how strings are parsed.

单行:

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