首页 > 解决方案 > 如何将所有分支的存储库从 Bitbucket 复制到 CodeCommit 但没有历史记录?

问题描述

如何将 Bitbucket 存储库复制到 CodeCommit,包括所有分支,但不包括所有分支上的所有历史记录?

想要这样做的原因:我们的配置服务器从 CodeCommit 中读取,但事实来源在 Bitbucket。(我们这样做的原因说来话长。)我们有一个脚本,当前(并且成功地)将 Bitbucket 存储库“复制”到 CodeCommit。我们正在调查是否可以通过在没有所有历史记录的情况下同步到 CodeCommit 来改进配置服务器的响应时间,因此当 ConfigServer 进行克隆或获取时,它不会花费很长时间(目前 15-25 秒的响应时间很常见)。

我们希望我们可以简单地添加--depth 1到我们的git clone --mirror命令中。但是,将镜像存储库推送到 CodeCommit 时,我们会收到错误消息。为了查看这是否只是 CodeCommit 问题,我尝试执行类似的操作来从 bitbucket 中读取数据并推送回新的 bitbucket 存储库。我得到了一个不同但类似的错误。

以下是核心步骤。这工作得很好,没有--depth 1

git clone --mirror --depth 1 ssh://<bitbucket> RepoFolder
cd RepoFolder
git remote add codecommit ssh://<codecommit>
git remote update origin
aws codecommit create-repository --repository-name pvvts_configs-RepoFolder --repository-description 'Synced'
git push --mirror codecommit

错误发生在最后一个命令 ( git push) 上。错误看起来像:

远程:未知提交 2280a0e659a1232a402041c27d94d81fd5142edberror:解包失败:未知提交 2280a0e659a1232a402041c27d94d81fd5142edb

接下来是每个分支的错误,如下所示:

[远程拒绝] dev -> dev(解包器错误)

如果我尝试做类似的事情,除了推回bitbucket,我会收到以下错误。(我跳过了 aws create-repository 步骤,而是先在 bitbucket 中手动创建新的存储库。)

错误:无法读取 6b0189279671f3a8c7b190dbc8d7ec91c0bb808a 到 ssh://git@bitbucket.pearson.com/pvvts_configs/vtscoreconfigurations_for_testing_only_marnee_1g_copy.git ![远程拒绝] dev -> dev(不允许浅更新)

我读到您现在可以从与 Git 1.9 或更高版本的浅同步中推送。我有 git 版本 2.7.4。(请参阅此处对问题的回答:https ://stackoverflow.com/a/21217267/1599362 。)但是,也许从普通克隆中删除了从浅同步推送的限制,而不是从mirror.

有没有办法进行这种浅同步?有没有其他方法可以实现我在 CodeCommit 中减少复制的 repo 大小的目的?(请注意,配置服务器本身确实有一个选项告诉它进行浅克隆。)

(我意识到,即使我可以成功地执行此“浅同步”,该配置服务器也可能无法很好地使用它,并且它可能无法提供我们想要的性能改进。测试将是下一步。)

标签: gitgit-cloneaws-codecommitconfigserverspring-cloud-config-server

解决方案


CodeCommit 似乎不允许您进行浅层更新。大多数 Git 托管服务提供商不这样做,因为这意味着存储库不完整,这会阻止服务器端的某些操作(例如拉取请求)工作。浅层请求的服务成本也很高。

正如您所指出的,这是 Git 中可用的一个功能,但不同的托管服务提供商支持协议的不同功能,因为它们对他们的基础设施有意义,而且他们中的许多人使用核心 Git 以外的服务来处理部分或全部的操作一推。

您可以尝试从 CodeCommit 到您的配置服务器进行浅层克隆,即使您在 CodeCommit 中有完整镜像,这仍然有效。该技术通常用于 CI 系统等事物,因为它使操作变得更快。如果您需要使用额外的 fetch 更新它,由于服务器上的额外工作,这可能比正常 fetch 慢,即使原始克隆更快,但无论如何它可能值得一试。

如果您的目标是减少 CodeCommit 中存储库的大小,那么您有点不走运。除非您想重写历史并将截断的历史推送到 CodeCommit,否则没有办法避免将整个历史推送到那里。


推荐阅读