2017-06-01 96 views
0

我的项目的一些点分离GitHub库开始用原型,然后我开发在它上面的实际解决方案。这项工作是顺序进行的,即每个新的开发分支在完成某个功能(然后删除)后都会重新合并为主,所以我有一个很好的线性历史记录。现在我注意到原型本身可能是有用的,我想从这个存储库中提取它并创建一个新的。在历史

为了更好地说明我的观点,这是我的历史看起来像现在(让我们说,TAG意味着在历史上任意选择的点时原型开始成为一个解决方案):

current repo: (ROOT)-----(commits)-----(TAG)--------(commits)---(HEAD) 

这是怎么我想它看起来:

current repo: (ROOT)-----(commits)-----(TAG)--------(commits)---(HEAD) 
new repo:  (ROOT)-----(commits)-----(TAG == HEAD) 

方的问题:是否有可能使它完全割裂开来,使它们看起来就像这样:

current repo: (TAG == ROOT)----(commits)-----(HEAD) 
new repo:  (ROOT)-----------(commits)-----(TAG == HEAD) 

回答

1

你可以做任何你想要的。对于“原型”回购,我将通过创建一个“镜像”克隆

git clone --mirror url/to/old/repo/origin 

为了使回购的原型版本是非常简单的开始。您必须将master移回标记最后一个原型版本的TAG。你必须找到那个提交。假设其SHA值为ABC123;然后

git reset --hard ABC123 

如果从最近的历史上任何其他标签或分支,您可能需要将其删除。但既然你说这是一个简单的,线性的历史,那就不应该有太多的事情。然后你可以清理它,如果你想。有几种方法;我通常跟

rm -r .git/logs 
git gc --aggressive --prune=now 

这就是现在你的原型回购。这会让你看到第一张照片。

现在,如果您还想从“解决方案”回购中删除原型历史记录,那么我将再次从新的克隆开始。如果这将取代原始回购,一个普通的克隆是好的;如果你使用这个来开始一个新的回购,我会建议一个镜像克隆。

从那里,有很多方法可以做到这一点,但如何

git rebase -i --root 

的编辑器,每犯行弹出。单独留下第一个人。通过(包括)第一个“解决方案”提交将第二个提交中的第一个单词更改为squash,然后保存并退出编辑器。

经过一些工作,一个新的编辑器会显示来自压扁的提交的合并提交消息。不管你想要什么,保存并退出。

如果这是一个普通的克隆,并且您正在替换原始的回购库,那么您现在强制推回主回收站。请注意,这是上游转账,其他任何使用回购的人都必须从中恢复。 (请参阅git rebase文档。)

+0

谢谢。我使用了答案的第一部分,但不得不停下来考虑压缩原始回购,因为我有人在分拣。 –

+0

还有另一种选择,称为“浅克隆”,可能在这种情况下起作用。有多种选项可以设置它(当克隆可能是最简单的时候,'depth = N'),但它所做的只是包括“更新”的历史记录,同时仍然保留了提交ID(这将有助于保持与叉的历史一致性) –