如何将存储库从 Bitbucket 复制到所有分支但没有历史记录的 CodeCommit?

How to copy repo from Bitbucket to CodeCommit with all branches but without history?

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

想要这样做的原因:我们的配置服务器从 CodeCommit 读取,但真实来源在 Bitbucket 中。 (我们这样做的原因说来话长。)我们有一个脚本,目前(并成功)"copies" 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)。错误看起来像:

remote: Unknown commit 2280a0e659a1232a402041c27d94d81fd5142edberror: unpack failed: Unknown commit 2280a0e659a1232a402041c27d94d81fd5142edb

每个分支都出现如下错误:

[remote rejected] dev -> dev (unpacker error)

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

error: Could not read 6b0189279671f3a8c7b190dbc8d7ec91c0bb808a To ssh://git@bitbucket.pearson.com/pvvts_configs/vtscoreconfigurations_for_testing_only_marnee_1g_copy.git ! [remote rejected] dev -> dev (shallow update not allowed)

我听说您现在可以使用 Git 1.9 或更高版本从浅同步推送。我有 git 版本 2.7.4。 (请在此处查看对问题的回答:。)但是,也许从普通克隆中删除了从浅同步推送的限制,但未从 mirror 中删除。

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

(我意识到即使我可以成功做到这一点 "shallow sync",配置服务器可能无法很好地发挥作用,并且它可能无法提供我们想要的性能改进。下一步将进行测试.)

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

如您所述,此功能在 Git 中可用,但不同的托管服务提供商支持协议的不同功能,因为这对他们的基础设施有意义,而且他们中的许多人使用服务除了核心 Git 之外,还可以处理推送中的部分或全部操作。

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

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