如何截断或减少 GitHub 上的 git 存储库

How to truncate or reduce a git repo that's on GitHub

提问人:kael 提问时间:1/22/2015 更新时间:11/2/2017 访问量:4095

问:

我知道这个问题的各种排列方式都在流传,但我无法发现任何解决我特定问题的东西。事情是这样的:

我在 GitHub 上托管了一个存储库。它是两个远程存储库的源 - 一个是我的开发计算机,另一个是服务器。我犯了一个愚蠢的错误,让一个脚本在一年半的时间里提交了增量用户数据库备份。所以现在我在我的 git 存储库中提交了大约 200mb 的文件和另外 1Gb 的增量数据库更改(是的,我吸取了教训)。从视觉上看,它看起来像这样,其中“C”表示合法的代码更改,“DB”表示它是仅包含不重要的数据库备份的提交:

C1--C2--C3--C4--DB--DB--DB--DB--DB--DB--DB--DB...(1.5 years)...DB--DB...

我想做的是:

                  /--DB--DB--DB--DB--DB...<--(throw all this away forever)
                 /
C1--C2--C3--C4--//<--REVERT TO THIS POINT --C5--C6--C7....

我基本上会创建一个包含所有这些愚蠢的数据库提交的分支,将我的存储库备份到分支离开的点,然后删除该分支。关于如何做到这一点的任何想法?理想情况下,我不必创建新的 GitHub 存储库,但我会接受任何性质的建议。

Git GitHub

评论

1赞 user229044 1/22/2015
这不是分支的工作方式,删除分支的行为不会删除该分支上的提交。
1赞 user229044 1/22/2015
从所有 Git 存储库提交历史记录中完全删除文件的可能重复项
0赞 Mykola Gurov 1/22/2015
所以你知道如何修复你的历史记录并删除错误的提交,你知道如何传播这些更改,你的问题主要是关于在 github 上回收浪费的空间,对吧?
0赞 kael 1/22/2015
@Mykola古罗夫不完全是。我所读到的关于删除错误提交的所有内容都与最近的提交有关,并说“如果您已经将更改传播到另一个存储库,那么您就不走运了”。也许我有点厚,但要把我发现的所有知识片段放在一起变成一个可行的解决方案有点困难。我绝对不是 Git 专家,并希望得到 Git 专家的建议。
0赞 Mykola Gurov 1/22/2015
取决于你是否可以改写历史。如果你没有其他人根据受影响的人积极开发分支,你可以简单地进行变基,留下不需要的提交,并用强制选项将更正的分支(主)推送到服务器。DB

答:

2赞 Frank N 11/2/2017 #1
  1. 找到要返回的提交: $ git log --before="2015-12-01" -n1 commit de4406f26ce506944b2b629890bba9e091468e05 Author: some Author<[email protected]> Date: Mon Nov 30 10:46:21 2015 +0100

  2. 重置指向它的(本地)存储库指针:

    git reset --hard <commit-hash>

  3. force² 将其推送到您的服务器(²,因为您必须覆盖历史记录)

    git push -f origin master

  4. 后续的数据库提交将在下次进行修剪,或者您立即进行修剪(修剪对您已经实现的、所需的清理没有影响。这只是为了真正摆脱那些未引用的东西)

    git prune.


如果你想安全起见,我建议

  • 您可以在第 1 步之前创建一个名为分支的分支(无需签出,只是为了指向您的旧提示!backup
  • 在步骤 3 之后,请确保主分支上的所有内容都符合您的喜好。然后删除该备份分支,然后进行修剪。

总之:

  • 不要将分支视为一整条提交线,而是将其视为结束提示,从而保持通向它的链的活力,这很有帮助。
  • 这些链成员一旦失去引用,就会被垃圾回收。