我想创建一个只有最后三次提交历史的孤儿分支?
MASTER -> A - B - C - D - E - F
NEW ORPHAN -> D - E -F
这是为了,我想保留新的孤立分支并删除现有分支以减少磁盘空间。
答案 0 :(得分:3)
事实是,git可能不是你提出的问题的解决方案。它在处理大型文件方面并不擅长,并且让它实际从已删除的提交中释放磁盘空间相当困难(因为它 非常适合保留历史记录)。所以最有用的答案是:不要。
但我也会提供技术上更完整的答案。
如果您的意图是放弃旧的提交,那么实际上没有必要使用孤立分支。你可以改变你的分支。最简单的方法是交互式rebase
git rebase -i
将弹出一个TODO列表,其中包含每个提交的条目。找到B
,C
和D
的条目,并将这些条目的第一个字(命令)从pick
更改为squash
。
你将离开
A -- B -- C -- D -- E -- F
ABCD -- E' -- F' <--(master)
其TREE
,ABCD
和E'
的内容(F'
)与原始D
,E
和F
的内容相匹配分别为{1}}。通过使用孤立分支,这是你将要努力的状态(通过更多的箍)。
请注意,即使任何引用无法访问它们,原始提交A
到F
仍然存在。如果有足够的时间,他们将被收回。首先,他们必须推出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
选项仅在回购中设置初始深度。你还需要定期“重新浅谈”回购。