5

我现在有一个庞大的、臃肿的 Git 存储库,占用了 GitHub 上的大量磁盘空间,我想节食。我需要丢弃在项目历史早期做出的与项目当前方向基本无关的古老提交。

我是 - 并且将永远是 - 这个私人回购的唯一用户。

理想情况下,我可以做类似的事情:

git rebase from-birth-of-repo-直到一个月前

谢谢,
道格

4

3 回答 3

7

--squash选项git merge可能有用,在 git 1.4.1 及更高版本中可用。这会分阶段合并的效果,但不会创建提交。因此,如果143eff是您想要包含在压缩提交中的最旧提交,您当前的分支是master并且“一个月前”提交是dcb7e5,您可以执行以下操作:

# Save the old position of "master" by creating a branch old-master:
$ git checkout master
$ git branch old-master

# Create and checkout a branch called "new-master" that's at the old commit:
$ git checkout -b new-master 143eff

# Stage the effects of merging the "one month ago" commit:
$ git merge --squash dcb7e5
Updating 143eff3..dcb7e5b
Fast-forward
Squash commit -- not updating HEAD
[... status output showing the staged changes ..]

# Create the squashed commit:
$ git commit -m "A commit squashing history up to a month ago"
# (You could use --amend if you want them to be squashed into 143eff
# instead of being a commit after that.)

现在您可以检查git diff dcb7e5 new-master它们是否真的相同。

接下来,您要将其余工作重新定位到 new-master 上:

$ git rebase --onto new-master dcb7e5 master

这将使您处于一个master应该具有您想要的历史的基础上。(同样,您可以使用git diff old-master master和进行检查git log。将 master 推送到 github 时,您需要添加--force,因为您已经重写了历史记录:

# Push master to github, with "--force", since you've rewritten history:
$ git push --force origin master

您现在可以使用以下方法删除new-mastersquash 提交中的 :

git branch -d new-master

显然 githubgit gc --auto在 push 上运行,所以你应该很快就会看到一些空间节省......

于 2010-07-28T11:55:10.913 回答
2

实际上,我将使用无聊的旧 git rebase -i HEAD~Number ,其中 Number 将带我从头部返回到初始提交。更耗时,但至少我对它在做什么有一个模糊的理解。感谢所有的建议。

于 2010-07-28T15:53:49.960 回答
1

这是一个适用于 Git 1.7.2 或更高版本的配方:

开始=$starting_sha1
git checkout --orphan new_master $start
git commit -m '新根'
git rebase --onto new_master $start master
git结账大师
git reset --hard new_master
git push -f 起源大师

清除不再引用的旧对象需要更多的工作,因为它们可能被引用日志、存储、标签、其他分支等指向。一旦确定这些已修复或删除,以下一项或多项应该帮助:

git 修剪
混帐 gc
git 重新打包 -ad
于 2010-07-26T23:56:07.837 回答