从历史记录中删除大文件/在本地完全删除历史记录,然后将其推送到原点

时间:2014-08-15 10:55:12

标签: git version-control

我是git的新手,完全迷失了。我确信我会错过一些基本的东西。

问题如下:

  1. 我已将大文件(~2Gb)提交并推送到存储库。然后我删除了它们 - 承诺 - 推动,但它们仍然在历史中。我需要以某种方式缩小存储库。
  2. 首先,我跟着how to shrink a git repository。我只能缩小本地版本,但当我试图推动时,它说我必须先拉。但是,拉动会带来重要的历史档案。
  3. revert multiple git commits类似,我通过两次完全删除了最后两次提交

    git reset --hard HEAD^
    git push -f origin master
    
  4. 现在,我无法在git log中看到最后两次提交,但存储库/历史记录仍然很大。

  5. 由于文件不在历史记录中,我不能remove deleted files from git history,因为git没有看到它们。
  6. 说,我是存储库的唯一用户和没有价值的历史记录,我只是需要以某种方式缩小存储库。但是,我只能在本地执行更改,然后将它们推送到存储库,因此,fully deleting the repository将无法正常工作,因为

        rm -rf .git
    

    删除了git,但我无法推送。

    做3有多糟糕?我能做些什么来实现我的总体目标?我将不胜感激任何建议。非常感谢提前。

2 个答案:

答案 0 :(得分:1)

@Jubobs总而言之,要使解决方案在上面工作,我必须更改远程仓库的一些设置。特别是,我必须允许以下操作

git push -f origin master

通过,首先,ssh远程仓库,然后设置

git config receive.denyNonFastforwards true

此外,要从远程仓库上的过时文件中爬出空间,请运行

git gc --aggressive --prune=all

出现了一个自然的问题:(1)ssh远程仓库,(2)删除.git文件夹,以及(3)运行git init来初始化新的仓库更容易。嗯,这也是一个解决方案。

答案 1 :(得分:0)

仅限(请确保您同意以下每个要点)

  • 历史没有价值,
  • 除了依赖远程存储库的其他任何人
  • 您希望保留在工作树中的所有文件(但不一定在回购中)当前位于您的工作树中(并且不会隐藏在某些提交中),
  • 你想在本地重新开始一个全新的回购,然后将该回购推送到远程,

执行以下操作。删除项目目录中的.git文件夹,然后再次初始化Git。

rm -rf .git
git init

将遥控器添加到repo的配置中:

git remote add origin <url-of-remote-in-question>

拍摄快照:

git add <at-your-discretion>
git commit -m "initial commit"

然后强制将全新的master分支推送到遥控器:

git push -f origin master

编辑:如果最后一次强制推送命令失败,则必须表示您的远程仓库配置为拒绝非快进合并。见Source Forge repo gives "denying non-fast-forward refs/heads/master" error