2023年GitHub项目镜像实践
由于多种原因,我希望将我的公共GitHub项目镜像到其他协作平台。这篇短文描述了我遇到的困难以及一个可行的解决方案。
一年来,我使用了GitHub到GitLab的拉取镜像功能。它可以复制代码、标签以及问题和拉取请求中的讨论,这很不错。但不久前,我注意到我的GitLab分支落后于源分支。我登录GitLab后看到了这个恼人的横幅:
GitLab拉取镜像功能从我的一些仓库中消失了。使用免费层再次启用它已经不可能。
对于来自俄罗斯的任何人来说,购买GitLab高级层都是不可能的。甚至免费试用也不允许。因此我开始寻找其他镜像解决方案:
运行自托管的GitLab或Forgejo服务器并不适合我,因为我不想在隔离的服务器上托管我的开源项目。
我检查了中国的Gitee,但不喜欢其对英语本地化的有限支持。
我查看了用于软件开发的Radicle p2p网络。但其“强大的基于区块链的功能”对我来说显得过于激进。
然后我查看了Codeberg。它由一个推广FOSS理念的非营利组织驱动。我比微软更喜欢他们。但在2020年3月,由于资源不足,他们禁用了镜像功能。他们说:“镜像仓库:轻松创建,永久消耗资源。” :(
我还检查了SourceHut(感谢paulmairo的建议)。它不太适合我,因为:
- 它只提供付费服务。
- 其工作流程看起来与GitHub不兼容:Sourcehut使用纯文本电子邮件报告错误、创建票据和提交补丁。
我检查了Salsa(感谢Mic_92的建议)。它是一个基于GitLab软件的Debian协作开发服务器。起初,我注册了一个账户。几天后,Salsa管理员启用了它,我成功地将我的一个项目从GitHub复制到Salsa。但事实证明,Salsa的拉取镜像功能被禁用了,类似于gitlab.com。我在Salsa问题跟踪器上询问了此事,但没有得到任何回复。
然后我在GitFlic上为我的GitHub项目创建了镜像,这是一个小型的概念验证协作平台。但它没有CI,也无法从GitHub问题和拉取请求中复制信息。显然,这不是一个最终的解决方案。
总之,我没有找到任何流行的代码协作平台可以为我的GitHub项目提供全功能镜像。因此我决定从另一个角度看待这个任务:如何手动备份GitHub问题和拉取请求中的信息?
我的第一个想法是将讨论变成代码的一部分。很快,我找到了一个不错的项目gh2md,它可以帮忙。gh2md从GitHub问题和拉取请求中抓取信息,并将其转换为Markdown文档。
在底层,它使用GitHub提供的GraphQL API,因此我必须生成一个具有公共访问权限的GitHub个人访问令牌。更多信息请参阅GitHub文档。
另一个选项是将GitHub问题保存在项目的git存储中:git-bug跟踪器可以完成这项工作(感谢Sergey Bronnikov的链接):
无论如何,在提交GitHub问题和PR的Markdown备份后,我决定在Codeberg上创建克隆仓库,然后同时推送到GitHub和Codeberg。我的项目从GitHub到Codeberg的迁移工作得很好。它复制了源的所有信息。因此,如果Codeberg有拉取镜像功能,它将是我的理想解决方案……唉!
但如何处理Codeberg上过时的问题/PR?手动删除和重新创建项目将是一个肮脏的黑客行为,我不喜欢这样。
我浏览了仓库设置,找到了一个变通方法:Codeberg提供了使用外部问题跟踪器的选项!我设置了外部问题的URL格式和编号,禁用了Codeberg拉取请求,现在从Codeberg仓库有了指向GitHub问题和PR的正确链接。
现在这是一个或多或少可行的解决方案。如果GitHub出现问题,我将在Codeberg启用内部问题跟踪器和拉取请求。
就这样。也许这个故事对某人会有用。