【问题标题】:Completely remove files from Git repo and remote on GitHub从 GitHub 上的 Git 存储库和远程文件中完全删除文件
【发布时间】:2011-07-30 15:09:44
【问题描述】:

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

现在,我在那个分支(master)中做了更多的提交。在我的 HEAD 中,我没有那个 ./static/images 文件夹。

因此,我的回购规模增加了很多。我怎样才能完全去除这些斑点?我也想从我的远程 GitHub 存储库中删除它。

【问题讨论】:

标签: git git-remote git-filter-branch git-rm


【解决方案1】:

这就是您要查找的内容: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

【讨论】:

  • 你告诉我做'git rm --cached '。但是,现在,我没有那个“./statis/images”文件夹,因为我在项目中有很多优势。之后我也做了很多提交。
  • @shadyabhi 嗯,也许尝试将 --ignore-unmatch 添加到 rm 命令。让我知道这是否有效。
  • @Darhuuk 我照你说的做了。有很多输出说“rm ...”。我做了 $git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch ./static/images' HEAD 然后 $rm -rf .git/refs/original/ && git reflog expire - -all && git gc --aggressive --prune 。我的回购大小仍然是 2.7MB。我的源代码只有 525KB。我的提交只有 118 .. 对于如此少的更改来说,它是相当巨大的。
  • @shadyabhi 您是否尝试过我链接的另一个 StackOverflow 问题中的解决方案?
  • @Darhuuk 我需要使用变基吗?我只是这一切的初学者,所以我并不完全遵循它。
【解决方案2】:

您可以重新设置整个分支的基础并删除添加图像的提交和删除它们的提交。

git rebase -i master

您将看到一个提交列表。删除包含要删除的恶意提交的行。 ("dd" 删除 vim 默认编辑器中的一行。然后用 ZZ 保存)

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

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

请注意,这对于从您的分支中提取的任何人来说都是非常烦人的。他们应该咨询"recovering from upstream rebase"


大概您最初意外添加的图像是您希望保留的提交的一部分。在这种情况下,您需要在变基期间编辑提交以拆分您希望保留的部分。您可以通过将该提交的“rebase -i”列表中的“pick”替换为“e”(用于编辑)来完成此操作。变基过程将在此处停止,您可以使用“git commit --amend”拆分提交。

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2014-11-19
      • 2011-03-28
      • 2013-05-28
      • 2015-11-05
      • 2012-08-31
      • 1970-01-01
      • 2020-10-31
      • 2020-05-31
      相关资源
      最近更新 更多