1

我有一个 2 年历史的存储库,它最初是一个私有存储库,因此它包含在不同点的历史记录中:密钥文件、加密密钥、不同地方的大量图像集等,在存储库的历史记录中,所有这些都不再被追踪,但仍然存在于历史中。

由于我们引入了新的开发人员,源代码现在变得共享,我想从一个基本干净的存储库开始一个干净的开始。但是,在这个过渡期间,我可能还必须处理旧存储库,在两个存储库之间共享补丁/提交。

在 git 中摆脱以前的历史,同时保持向后兼容性,尽可能干净地在旧存储库和新的干净存储库之间共享提交的能力的最佳方法是什么?

目标:

  1. 以新存储库中不可用的历史记录的方式进行敏感提交。
  2. 允许新存储库中的全部功能(克隆、推送、获取,对 git 来说是正常的一切)
  3. 最大化旧仓库识别来自新仓库的补丁/提交的能力
  4. [不太重要] 由于工作副本中不存在的古代提交中没有二进制文件,因此使新的 repo 更快。
4

4 回答 4

2

仅在现有存储库中创建一个新的、清晰的分支将无济于事:如果用户可以阅读此分支,他们还可以访问包含您的敏感信息的旧分支。为了克服这个问题,您必须创建一个对过去没有(或只有有限)知识的新存储库。

为此,我将执行以下操作:

  • 获取你的 repo 的一个相对较新的状态(例如,最后一个标记的版本或类似的东西V1.0),并以此为开始创建一个的repo ( newrepo),供你的新开发人员使用。

  • 然后,在您的机器上,添加一个远程调用oldrepo,指向保存旧敏感数据的旧存储库。

  • 接下来,将所有的提交从V1.0最新的到最新的oldrepo提交cherry-pick到你的新仓库中。此时,您的新仓库与oldrepo没有脏历史的状态相同。

  • 现在,从( )克隆一个裸仓库。您的所有开发人员都克隆并处理它。newreponewrepo.gitnewrepo.git

如果涉及到取补丁等,newrepo.git反之亦然oldrepo,此操作将由完成,即您的同事将您生成的所需补丁发送给您,format-patch并将am它们发送到旧仓库中。如果您在 中完成了一些修复oldrepo,您可以将cherry-pick它们重新放入newrepo.git并提供给您的开发人员。

这限制了oldrepo对您的访问,您的同事将永远不会看到任何敏感数据。

于 2012-07-03T09:55:56.380 回答
1

您可以尝试的(我不知道这是否可行)是创建一个单独的分支来跟踪新开发,该分支从空提交(即没有父级)开始,然后将内容复制进去。然后合并分支回到旧主(手动)。之后,您应该能够在新分支上进行开发并将更改从它拉入旧分支。而且您不必将旧分支发布给其他人。

就像和图像一样,O原始分支在哪里,C是在新的无父分支中复制,M是手动合并,m是后续合并。

# -- # -- # -- O --- M ------------ m -- m
                    /              /    /
                   /              /    /
                  C -- # -- # -- # -- # -- #
于 2012-07-02T17:21:48.273 回答
0

这取决于您对“向后兼容性”的具体含义,但您应该能够指定一个--depth 1参数git clone(如git-clone 手册页中所述)并获得可以共享补丁的东西(尽管提交本身将无法通过您可能习惯的正常推/拉机制共享。

于 2012-07-02T17:16:10.927 回答
0

使用 git branch 创建一个新分支。然后 git rebase 你的第一个到最后一个提交,以获得旧分支的无历史版本。

您可以随时返回旧分支以获取提交的具体细节。

于 2012-07-02T21:03:53.970 回答