Git:remove提交时间超过1年



我有一个web应用程序,使用git不仅可以管理源代码管理,还可以部署更改。我将更改推送到github上的远程repo,我的Web服务器有一个webhook,然后根据这些更改进行更新。

现在我注意到我的本地git存储库大约是9GB。我从github克隆了回购,并注意到即使在那时我的回购也大约是1.5GB。

我敢肯定,从最初的开发阶段开始,这大部分都是不必要的膨胀。我想把它扔掉以释放磁盘空间。我在谷歌上搜索过一些,但只找到相对复杂的解决方案。我的场景是一个分支,一个开发人员,许多微小的提交。

有没有一种简单的方法可以消除超过12个月的更改,从而在本地和远程释放空间?

感谢

要删除早于X的历史记录,您需要重写回购的历史记录。重写大型回购的最有效方法可能是使用git-filter-repo。注意git-filter-repo是一个python脚本,所以如果您还没有安装它,您也需要python。

一旦您准备好了git-filter-repo,回答问题的步骤就相当简单了,Git手册中甚至描述了类似的gitreplace场景。

基本上,步骤是:

  1. 创建一个新的parentless提交(也称为rootcommit(,该提交等同于您希望保留的第一个提交的状态
  2. 将当前历史记录中的提交替换为新的根提交
  3. 使用git-filter-repo使其永久化

例如,假设您希望保留的第一个提交具有X:的提交哈希

  1. echo 'Truncate history to single commit' | git commit-tree X^{tree}

    上面命令的输出将是一个新的提交哈希,我们称之为Y

  2. git replace X Y

  3. git filter-repo --force

注意:git-filter-repo仅涉及您的本地回购。如果你对新的重写回购感到满意,你可以重新添加遥控器并将其推出。

如果您可以选择一个提交开始(并忘记单个提交背后的一切(,我可以为您提供一个脚本,它可以。。。让我们称之为"再生">所有提交都超过了那个提交,而且它实际上会做得很快。。。。当然,你会改写历史,只是想把它说清楚。

https://github.com/eantoranz/git/blob/replay/contrib/replay.

使用它的方法是:

  • 选择一个你想开始改写历史的承诺,它会忘记后面的一切。在上面创建一个分支
git branch oldbase <some-commit-id>

然后从该提交创建一个孤立分支,这样您就可以清理所有以前的历史

git checkout --orphan newbase oldbase
git commit -C oldbase # create a commit using the same comment as old-base

现在是脚本开始发挥作用的时候

the-replay-script --new-base newbase --old-base oldbase --tip master

这将在newbase提交之上重播oldbase..master范围内的所有提交。它最终将打印一个提交ID。查看提交(检查、记录等(。如果你确信这就是你作为新主人想要的:

git branch -f master <the-commit-written-by-the-script>
git checkout master

你可以随意把它推到你想推的地方。

最新更新