2016-07-25 114 views
0

我有巨大的git仓库(二进制文件),我想删除旧的提交缩小它的大小。Git - 如何删除旧提交而不影响最近提交的sha-1?

假设我的提交历史;

$ git log 
g0g0g0 - patch 06 
f0f0f0 - patch 05 
e0e0e0 - patch 04 
d0d0d0 - patch 03 
c0c0c0 - patch 02 
b0b0b0 - patch 01 
aaaaaa - initial empty 

而且每个提交都有标签;

$ git tag 
tag01 -> b0b0b0 
tag02 -> c0c0c0 
tag03 -> d0d0d0 
tag04 -> e0e0e0 
tag05 -> f0f0f0 
tag06 -> g0g0g0 

这是我想要的;

$ git log 
g0g0g0 - patch 06 <- tag06 
f0f0f0 - patch 05 <- tag05 
e0e0e0 - patch 04 <- tag04 
aaaaaa - initial empty 

$ git tag 
tag01 -> deleted b0b0b0 
tag02 -> deleted c0c0c0 
tag03 -> deleted d0d0d0 
tag04 -> e0e0e0 
tag05 -> f0f0f0 
tag06 -> g0g0g0 

是否可以删除旧的三个提交(b0b0b0,C0C0C0,d0d0d0)在不改变其他提交的SHA-1的值(g0g0g0,F0F0F0,e0e0e0)?

+0

你可以做一个浅层克隆,或者如果你需要更高的精度,你可以用'git rev-list --objects'和'git pack-objects'使用移植和自定义构造包,然后替换'.git/objects /包装与结果。尽管如此,这只能在本地回购中发挥作用。如果不更改已发布的ID,则无法更改已发布的历史记录。 – jthill

回答

8

不,这是不可能的。提交的父项用于计算其散列值。如果历史的任何部分发生更改,则提交哈希将会不同。