我不小心添加了一个图像文件夹并提交了。然后,我又做了一个承诺。然后我删除了这些文件git rm -f ./images
并再次提交。
现在,我在那个分支(master)中做了更多的提交。在我的 HEAD 中,我没有那个./static/images
文件夹。
因此,我的回购规模增加了很多。我怎样才能完全去除这些斑点?我也想从我的远程 GitHub 存储库中删除它。
我不小心添加了一个图像文件夹并提交了。然后,我又做了一个承诺。然后我删除了这些文件git rm -f ./images
并再次提交。
现在,我在那个分支(master)中做了更多的提交。在我的 HEAD 中,我没有那个./static/images
文件夹。
因此,我的回购规模增加了很多。我怎样才能完全去除这些斑点?我也想从我的远程 GitHub 存储库中删除它。
这就是您要查找的内容:忽略不会删除文件。我建议您阅读该页面,但这是要使用的特定命令:
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: forever remove files or folder from history。
另一个有很多解释的链接:删除敏感数据。
[编辑]另外,请参阅 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 filter-branch 解决方案)。
请注意,这对于从您的分支中撤出的任何人来说都是非常烦人的。他们应该咨询“从上游变基中恢复”。
大概您最初意外添加的图像是您希望保留的提交的一部分。在这种情况下,您需要在变基期间编辑提交以拆分您希望保留的部分。您可以通过将该提交的“rebase -i”列表中的“pick”替换为“e”(用于编辑)来完成此操作。变基过程将在此处停止,您可以使用“git commit --amend”拆分提交。
我基本上是在重复这个答案并结合这个Windows 格式警告,只是这样它就不会作为评论丢失。
请注意使用双引号而不是单引号,因为它取决于您使用的 shell 如何解析字符串。
单线:
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