我正尝试使用类似于此处描述的公共/私有混合工作流在GitHub上管理一个开源项目:https://stackoverflow.com/a/30352360/204023
本质上,这描述了一个过程,其中有两个相互镜像的存储库,而没有GitHub的fork
关系。这允许您使用标准的git远程存储库在分支之间推/拉更改,以及公共GitHub拉取请求以将私有更改合并到master分支中。正是我要完成的任务。
我还有一个额外的要求,我想在保留敏感提交历史的同时截断PUBLIC提交历史,以保持敏感数据。
使用--depth 1
初始化新项目是非法的,您不能使用浅克隆来初始化新的仓库:! [remote rejected] master -> master (shallow update not allowed)
我发现的用于删除提交历史记录的解决方案涉及创建一个全新的存储库,但是有了该存储库的新副本,我将无法再在公共/私有副本之间进行推/拉。
答案 0 :(得分:3)
Git存储库中的历史记录是。提交包含文件和链接:每个提交都具有所有文件的完整快照以及其父级的哈希ID。每个分支名称都存储 latest 提交的哈希ID(单数),Git通过从头开始并向后工作(一次是一个父代)来查找历史记录。
由于每个提交的哈希ID是该提交的内容的加密校验和(包括父哈希),因此 last 提交的哈希ID取决于历史记录中每个提交的哈希ID,这些ID是通过从该提交向后走入其他所有可达的提交而形成的。 (从技术上讲,这是Merkle tree的一种形式。)
所有这些的含义是,可以将存储库DAG的较短的版本保持公开,而将较长的版本(较短和添加的提交)保持为公开状态。私有版本,但 不可能有一个公开版本,它会省略一些历史提交而保留其他历史提交。或者,您也可以使用平行图,即独立的DAG:一个包含公共历史记录,另一个包含私有历史记录。如果通过Git子模块执行此操作,则可以合理地确定不会释放私有信息,但这确实构成了强大的结构约束:公共内容必须全部为子目录。