git:从某个提交开始发布,保留早期历史,但可证明



我已经入侵一个库很长一段时间了,在我的private存储库中有很多提交:

A -> B -> C -> D -> E

最后,我即将完成第一个版本,并希望从D开始将其发布到一个名为public的远程服务器,将A..C保留给自己,因此public之后应该是这样的:

D -> E

根据要求,我希望能够证明我是如何到达D的(想想版权声明等)。由于(目前)几乎不可能根据时间和变更集对链中提交的哈希进行反向工程,我认为只保留D的父指针指向C将是git的一个天才优势。遗憾的是,我找不到一种方法来真正做到这一点。

那么,我如何将D -> E推送到public,使其成为一个功能齐全的公共存储库,其中包括签出DED所需的所有对象,这些对象仍然指向C作为父对象?

什么不起作用:

射程推进

git push public D..E:master
error: src refspec D..E does not match any.
error: failed to push some refs to '<public>'

任何形式的挤压/改写历史

据我所知,压缩A..D将引入一个新的提交,删除指向C的父指针,从而删除A..C存在的可证明性。(简单的例子:假设C逆转了B,那么你永远无法证明B在某个时刻存在。)

很明显,我可以在南瓜提交的描述中手动注意到C的散列,但已经有一个parent指针字段了,为什么不使用它呢?

此外,为了对公共部门做出进一步的改变,我不得不在这个新的压缩提交之上重新调整我的私人分支机构的基础,这似乎是错误的。。。

从深度有限的本地克隆推送

我想我找到了一个解决方案,首先创建一个具有所需深度的本地克隆local_public,然后将该克隆推送到public,如下所示:

git clone --depth 2 file:///<abspath_private> local_public

git log --pretty=raw

我可以验证local_public只包含D -> E,并且提交、树和父散列是相同的,这正是我想要的。

问题是,当我试图从local_public推送到添加的public时,我会收到这样的错误:

 ! [remote rejected] master -> master (shallow update not allowed)

有什么办法让它发挥作用吗?

您想要的是不可能的

Git中的提交就像一个链表。每个提交都有父提交的ID(如果是根提交,则为null)。。。父提交的ID是提交标识的一部分。

要将D->E推送到回购,您需要修改D的父级,这将导致D的HASH发生变化,这反过来又需要E的哈希也发生变化(因为E将有一个新的父级)。

最新更新