首页 > 解决方案 > 具有不同提交历史的公共/私人 git 存储库

问题描述

我正在尝试使用类似于此处描述的混合公共/私有工作流程来管理 GitHub 上的开源项目:https ://stackoverflow.com/a/30352360/204023

本质上,这描述了一个过程,其中有两个相互镜像的存储库,没有 GitHub 的fork关系。这允许您使用标准 git 远程存储库在分支之间推送/拉取更改,并使用公共 GitHub 拉取请求将私有更改合并到主分支中。正是我想要完成的。

我有一个额外的要求,我想截断 PUBLIC 提交历史,以防它包含敏感数据,同时保留 PRIVATE 提交历史。

初始化新项目被--depth 1证明是非法的,你不能用浅克隆初始化一个新的仓库:! [remote rejected] master -> master (shallow update not allowed)

我找到的用于截断提交历史的解决方案涉及创建一个全新的存储库,但是使用该存储库的新副本,我无法再在公共/私有副本之间推送/拉取。

标签: gitgithub

解决方案


Git 存储库中的历史就是提交。提交包含文件和链接:每个提交都有所有文件的完整快照,加上其父项的哈希 ID。每个分支名称都存储最新提交的哈希 ID(单数),Git 通过从末尾开始并向后工作来查找历史记录,一次一个父级。

由于每个提交的哈希 ID 是该提交内容的加密校验和- 包括父哈希 -最后一次提交的哈希 ID 取决于历史中每个提交的哈希 ID,该历史是从该提交向后遍历每个其他可达的提交。(从技术上讲,这是Merkle 树的一种形式。)

所有这一切的含义是,可以将存储库 DAG的较短版本保持为公开,并将较长版本(较短加上添加的提交)作为私有版本,但不可能有一个省略一些历史提交的公开版本在留住别人的同时。您也可以,或者相反,使用平行图,即独立的 DAG:一个包含公共历史,一个包含私人历史。如果您通过 Git 子模块执行此操作,则可以合理地确定不会发布私有信息,但这确实会施加强大的结构约束:公共内容必须都是子目录。


推荐阅读