搭建 GitHub 镜像仓库

本贴最后更新于 1370 天前,其中的信息可能已经物是人非

需求背景

国内访问 GitHub 仓库实在太慢,项目主要提交者也就我和 V,外加以后打算自己建立仓库,所以决定在新项目上试试。

将 GitHub 仓库作为镜像仓库,主库设在自建的服务器上。这样既能获得 GitHub 协作特性(Issues、PR、Actions、Release 等),开发时又能享受高速提交和拉取。

服务端

  1. 创建 Git 用户,配置 git-shell 等,然后配置 SSH 密钥,密钥分为两类:

    • 客户端提交服务端用,修改 ~/.ssh/authorized_keys
    • 服务端自动推送 GitHub,修改 ~/.ssh/id_rsa.pub。GitHub 上需要配置账号 SSH 或者仓库 Deploy Keys
  2. 切换到 Git 用户,并在 ~ 下创建仓库

    mkdir sample.git && cd sample.git && git clone --bare git@github.com:youraccount/sample.git
    
  3. 在 hooks 目录下创建名为 post-receive 的脚本:

    #!/bin/sh
    
    git push --mirror git@github.com:youraccount/sample.git >/dev/null 2>&1 &
    

    设置脚本执行权限:

    chmod +x post-receive
    

客户端

克隆服务器上的仓库或者将现有仓库的远程地址改为服务端仓库:

git remote set-url origin git@yourserver:sample.git

这样以后推送本地仓库就会推送到服务端仓库,然后服务端仓库触发 post-receive 钩子,覆盖 GitHub 上的镜像仓库。

注意事项

  • git push --mirror 是个“危险”的操作,它会完全覆盖 GitHub 上的远程仓库,包括分支、标签,所以推送前一定要确认清楚。可以在 GitHub 上建立一个测试仓库来先测试一下,一切正常的话再改成最终的镜像仓库
  • 上面的 post-receive 脚本通过后台执行 push 实现“异步”推送镜像仓库,并且输出都被忽略了,所以无论是否成功脚本都不会返回报错。建议在测试阶段改成同步执行,这样客户端可以看到输出结果。后期改成后台执行以后,也许会因为某些原因(比如网络问题)导致推送失败,可以考虑加个系统定时任务周期执行
  • GitHub 镜像仓库如果有 PR 合并,需要单独处理
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2036 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖 • 1 关注
  • 同步
    28 引用 • 398 回帖
  • 镜像
    6 引用 • 21 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • MrLi

    奈斯