从Git仓库中删除文件,Github以及提交者

3

有人不小心将80兆字节的JPG文件提交到我们的git仓库并推送到github中央仓库。

后来有几个人拉取了这些更改。

除了开除提交者,我该怎么样才能彻底从仓库历史记录和github上删除这些图像?然后将所有更改强制应用于其他提交者。

4个回答

4

您需要通过 git reset sha_of_last_good_commit 修复更改,然后使用 git push -f 推送这些备份。然后,您需要告诉所有人拉取新的更改。

  • 如果有一些更改您想要与错误提交混在一起保留,您需要在将修复后的存储库推送回 github 之前使用 git rebase -i 取出不需要的更改。

  • 垃圾收集可能会删除悬空对象,或者您可以使用 git gc --aggressive 强制进行垃圾回收。


拉取者需要非常小心,否则他们会重新引入提交。最好让他们重新克隆。确保他们保存旧的本地仓库,以便不会丢失他们可能有的未推送工作。 - Tekkub

1
一个更激进的方法是使用filter-branch
git filter-branch --tree-filter 'rm -f *.jpg' HEAD

然而,当你使用它时,你应该非常小心,因为你可能会真的搞砸你的存储库。在做任何事情之前,你应该先检查文档


最终我不得不使用这个。 - iBiryukov

0
使用 git reset将更改还原到该人提交之前。我认为无法强制更新已经拉取更改的人。
git reset --hard HEAD~3 ## will reset the head to three commits ago

仔细想想,文档上说:

最后三个提交(HEAD、HEAD^和HEAD~2)是错误的,你不想再看到它们了。如果你已经把这些提交给别人了,就不要这样做。

简而言之 - 只需删除文件即可。我不知道你是否可以删除历史记录,也不能强制在像git这样的分布式系统中更新某些内容。


0

即使你执行了git reset --hard HEAD~3,然后再执行git push --force,问题仍未解决。

正如gpojd所引用的:

如果你已经将这些提交给其他人,请不要这样做

但是,你已经这样做了。如果你将修改后的版本推送到中央仓库,并且某个人从中央仓库获取了包含三个错误提交的版本,则这三个错误提交仍然存在于他/她的仓库中。

每个在三个错误提交存在于仓库中时拉取过的人都必须从他们的仓库中删除这些错误提交,以使它们再次变得干净。

因此,请告诉他们启动控制台并使用git fetch origin(从GitHub获取版本)git rebase -i origin/master将他们的主分支重新基于你强制推送的分支,并告诉他们需要删除的提交的SHA-ID。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接