我现在有一个庞大的、臃肿的 Git 存储库,占用了 GitHub 上的大量磁盘空间,我想节食。我需要丢弃在项目历史早期做出的与项目当前方向基本无关的古老提交。
我是 - 并且将永远是 - 这个私人回购的唯一用户。
理想情况下,我可以做类似的事情:
git rebase from-birth-of-repo-直到一个月前
谢谢,
道格
我现在有一个庞大的、臃肿的 Git 存储库,占用了 GitHub 上的大量磁盘空间,我想节食。我需要丢弃在项目历史早期做出的与项目当前方向基本无关的古老提交。
我是 - 并且将永远是 - 这个私人回购的唯一用户。
理想情况下,我可以做类似的事情:
git rebase from-birth-of-repo-直到一个月前
谢谢,
道格
--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-master
squash 提交中的 :
git branch -d new-master
显然 githubgit gc --auto
在 push 上运行,所以你应该很快就会看到一些空间节省......
实际上,我将使用无聊的旧 git rebase -i HEAD~Number ,其中 Number 将带我从头部返回到初始提交。更耗时,但至少我对它在做什么有一个模糊的理解。感谢所有的建议。
这是一个适用于 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