如何使用最后三次提交创建一个git orphan分支?

时间:2017-11-21 14:46:23

标签: git

我想创建一个只有最后三次提交历史的孤儿分支?

MASTER -> A - B - C - D - E - F 
NEW ORPHAN -> D - E -F 

这是为了,我想保留新的孤立分支并删除现有分支以减少磁盘空间。

1 个答案:

答案 0 :(得分:3)

事实是,git可能不是你提出的问题的解决方案。它在处理大型文件方面并不擅长,并且让它实际从已删除的提交中释放磁盘空间相当困难(因为它 非常适合保留历史记录)。所以最有用的答案是:不要。

但我也会提供技术上更完整的答案。

如果您的意图是放弃旧的提交,那么实际上没有必要使用孤立分支。你可以改变你的分支。最简单的方法是交互式rebase

git rebase -i

将弹出一个TODO列表,其中包含每个提交的条目。找到BCD的条目,并将这些条目的第一个字(命令)从pick更改为squash

你将离开

A -- B -- C -- D -- E -- F

ABCD -- E' -- F' <--(master)

TREEABCDE'的内容(F')与原始DEF的内容相匹配分别为{1}}。通过使用孤立分支,这是你将要努力的状态(通过更多的箍)。

请注意,即使任何引用无法访问它们,原始提交AF仍然存在。如果有足够的时间,他们将被收回。首先,他们必须推出reflog(或者你必须销毁reflog)。然后git gc必须运行。

一种快速(ish)方法是在rebase之后创建一个新的克隆。

当然,交互式rebase并不是最简单的脚本,所以如果你想要一个可重复的过程,你可能需要做一些不同的事情。您可以编写类似

的脚本
# get the work tree for a new root
git checkout master~2
# break from history
git checkout --orphan new_master
# start the new branch
git commit -C master~2
git rebase --onto new_master master~2 master
git branch -d new_master

您仍然遇到以下问题:旧的提交在数据库中不断消耗空间。

另一种选择是使用“浅枝”。据我所知,浅层分支只能通过克隆创建,但在正面处负责从数据库中清除旧对象。这也保留了提交元数据(和提交标识)。

git clone --depth=3 --no-single-branch file://localhost/path/to/old/repo new-repo

请注意depth选项仅在回购中设置初始深度。你还需要定期“重新浅谈”回购。