|
19
|
| David Claridge · 技术社区 · 15 年前 |
|
|
1
17
本·杰克逊的回答已经涵盖了这个基本概念,但是我想在这里补充一些关于最终目标的注释(不仅仅是一个评论的价值)。 您可以很容易地拥有两个分支,一个具有完全干净(没有私有文件)的历史记录,一个完整(具有私有文件),并适当地共享内容。关键是要注意如何合并。过于简单化的历史可能看起来像这样:
这个
当然,在现实中,你的工作流程可能会变得更复杂一些。您可以在自己的分支上开发一个主题(feature/bugfix),然后将其合并到公共和私有版本中。你甚至可以时不时地摘樱桃。实际上,任何事情都会发生,除了将private合并为public之外。 过滤支管
所以,您现在的问题只是让您的存储库进入这种状态。不幸的是,这可能相当棘手。假设存在一些涉及私有和公共文件的提交,我相信最简单的方法是
然后创建一个只包含私有内容的临时分支:
这将为您提供只有一个合并的历史记录:
注意:这里有两个单独的根提交。有点奇怪,如果你想避免,你可以用
这会给你带来这样的历史:
同样,如果你想让他们有一个共同的祖先,你可以做一个
注意:如果您的历史记录中已经有合并,则需要使用
假装的编辑:如果修改历史确实很难,你可以完全捏造它:将整个历史压缩为一个提交,在已有的根提交的基础上。像这样的:
所以你最终会得到:
哪里
此时,您可以将public合并为private,从那时起,按照我在回答顶部描述的工作流进行操作:
这个
|
|
|
2
5
提交的SHA基于commit blob,它包括父SHA、提交文本和文件树的SHA。这棵树包含了树上每一个斑点的沙。因此,任何给定的提交都依赖于该修订中的所有内容,并且每个父修订都返回到空存储库。如果您有一个来自包含不想发布的文件的版本(无论多么间接)的提交,那么您不想发布该分支。
第一个例子
您应该能够运行filter branch命令,从“clean”提交创建新的提交。历史会有些奇怪(旧版本可能无法构建,因为它们现在不完整或已损坏)。这不会销毁存储库中的任何现有分支或blob。它将创建所有新的(并行的)共享文件blob但不共享树或提交的文件blob。您应该能够安全地推送该分支,而不公开它不引用的任何对象(推送分支时,只推送由该分支命名的SHA及其依赖项)。然而,这有点冒险,因为
|