我不小心添加了一个图像文件夹并已提交。然后,我又做了一次提交。
然后我使用git rm -f ./images
删除了这些文件并再次提交。
现在,我在该分支(主)中做了很多提交。在我的HEAD中,我没有./static/images
文件夹。
由于这个原因,我的回购规模增加了很多。如何完全删除这些斑点?我也希望将它从我的远程GitHub仓库中删除。
答案 0 :(得分:124)
这就是你要找的东西: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: forever remove files or folders from history。
另一个包含大量解释的链接:Remove sensitive data。
[编辑] 另外,请参阅此StackOverflow问题:Remove sensitive files and their commits from Git history。
(在上面链接的问题中从natacado
的答案复制的命令。)如果您已从工作副本中删除了文件,则以下内容应该有效。找出添加了不需要的文件的提交的哈希值。然后做:
git filter-branch --index-filter \
'git update-index --remove filename' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force
答案 1 :(得分:9)
您可以重新定义整个分支并删除添加图像的提交和删除它们的提交。
git rebase -i master
您将看到提交列表。删除包含要删除的恶意提交的行。 (“dd”删除vim中的一行,默认编辑器。然后用ZZ保存)
然后在自然git垃圾收集过程中清理悬空提交,这个过程可以用Darhuuk的答案中给出的命令强制执行。
编辑:即使您已经推送到远程存储库,这也会有效,但您必须使用--force。 (这同样适用于git filter-branch解决方案)。
请注意,对于从您的分支机构撤出的任何人来说,这都会非常烦人。他们应该咨询"recovering from upstream rebase"。
据推测,您最初意外添加图像是您希望保留的提交的一部分。在这种情况下,您需要在rebase期间编辑提交以拆分您希望保留的部分。您可以通过使用“e”(用于编辑)替换该提交的“rebase -i”列表中的“pick”来完成此操作。 rebase进程将在此处停止,您可以使用“git commit --amend”拆分提交。
答案 2 :(得分:3)
我基本上重复了the answer与Windows formatting caveat的结合,只是因为它不会作为评论而丢失。
请注意使用双引号而不是单引号,因为它取决于您正在使用如何解析字符串的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