使用git,我如何创建一个主要是无历史记录的存储库克隆

时间:2012-07-02 16:50:25

标签: git repository revision-history

我有一个2岁的存储库,它本质上是一个私有存储库,所以它包含在它的不同点的历史记录中:密钥文件,加密密钥,各种地方的大型图像集等等,在历史上存储库,所有这些都不再被跟踪,但仍然存在于历史中。

源代码现在正在变得共享,因为我们正在引入新的开发人员,并且我希望从一个大多数干净的存储库开始。但是,在此过渡期间,我可能还必须处理旧存储库,在两个存储库之间共享补丁/提交。

在git中脱离以前的历史记录并保持向后兼容性能够尽可能干净地共享旧存储库和新的清理存储库之间的提交的最佳方法是什么?< / p>

目的:

  1. 以过去不可用的历史记录进行敏感提交 新的存储库。
  2. 允许新存储库中的完整功能(克隆,推送,获取,git正常的所有内容)
  3. 最大化旧存储库识别来自新存储库的补丁/提交的能力
  4. [不太重要]由于在工作副本中没有的古代提交中没有二进制文件,因此可以更快地创建新的回购。

4 个答案:

答案 0 :(得分:2)

在现有仓库中创建一个新的,明确的分支将无济于事:如果用户可以阅读此分支,他们也​​可以访问包含敏感信息的旧分支。为了解决这个问题,你必须创建一个新的回购,没有(或只有有限的)过去的知识。

为实现这一目标,我将采取以下措施:

  • 采用相对较新的回购状态(例如最后标记的版本或类似内容,比如说V1.0)并将其用作创建回购的开头(newrepo)您的新开发人员使用。

  • 然后,在您的计算机上,添加一个名为oldrepo的{​​{3}},指向包含旧敏感数据的旧存储库。

  • 接下来,将V1.0的所有提交内容从最新的oldreporemote提交到您的新回购中。此时,您的新仓库与oldrepo的状态相同,没有脏历史记录。

  • 现在,cherry-pick来自newreponewrepo.git)的裸露回购。您的所有开发人员都会克隆newrepo.git并对其进行处理。

如果要将补丁等从newrepo.git转换为oldrepo,反之亦然,此操作将由完成,即您的同事发送您生成的所需补丁由format-patcham他们进入旧的回购。如果您在oldrepo中完成了一些修复,则可以再次cherry-pick将其newrepo.git转换为您的开发者。

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

答案 1 :(得分:1)

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

as和image它是这样的,其中O是原始分支,C是新的无父分支中的副本,M是手动合并,m是后续的合并。

# -- # -- # -- O --- M ------------ m -- m
                    /              /    /
                   /              /    /
                  C -- # -- # -- # -- # -- #

答案 2 :(得分:0)

这取决于您通过“向后兼容性”具体表示的内容,但您应该能够为--depth 1指定git clone参数(如git-clone man page中所述)并获取<可以共享em> patches (虽然提交本身将无法通过您可能习惯的普通推/拉机制共享。

答案 3 :(得分:0)

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

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