我们使用 github 来管理我们的大量软件环境,我敢打赌,像许多其他组织一样,该存储库的绝大多数流量来自我们的办公室。 考虑到这一点,有没有一种方法可以构建给定 github 存储库的本地缓存,但仍然具有云版本的保护? 我在缓存代理服务器的模型中考虑这一点,其中本地服务器(大概在我们的建筑物中,在我们的本地网络上)将处理绝大多数克隆/拉取操作。
这看起来应该是可行的,但是搜索它非常困难,我认为这在很大程度上是因为“本地”和“缓存”这两个词具有超载的含义,特别是对于 git(hub) 问题。
您应该查看 git-cache-http-server 项目。 我认为它部分实现了您所需要的(并且类似于@larsks 帖子中的想法)。
它是一个 NodeJS 软件,运行 HTTP 服务器,为您提供对本地缓存的 git 存储库的访问。 服务器会在需要时自动获取上游更改。 如果您使用这些本地 git 存储库而不是远程存储库,您的 git 客户端将获得本地缓存的内容。
如果您在单独的主机(例如虚拟机或容器)上运行 git-cache-http-server,您可以将本地 git 客户端配置为自动克隆并从缓存中获取,方法是将其配置为将
https://github.com
替换为类似的内容http://gitcache/github.com
。 这可以通过如下配置来实现:
git config --global url."http://gitcache:1234/".insteadOf https://
目前,该软件仅提供缓存来克隆和更新存储库,没有提供推送更改的功能。 对于某些用例,考虑一个 CI 基础设施需要提取多个存储库的内容,即使只有一个存储库发生了变化,或者您提到的自动化测试,这可能很有用。
您的最新评论清楚地表明您正在寻求性能优化。这有帮助。
您可以按照这些说明开始创建 github 存储库的本地镜像。 您可以定期更新它,也可以安排从 github 接收 web hooks 来“按需”更新本地镜像。 为此,您需要设置一个小型 Web 服务来响应来自 github 的钩子。 您可以通过访问 https://github.com/someuser/someproject/settings/hooks/new 添加网络挂钩。 您可能需要选择“让我选择单个事件”单选按钮,然后选择:
这将使您的缓存根据可用标签和分支的更改保持最新。
设置一个 git 服务器,使该存储库在本地可用。 这可以像运行
git daemon
一样简单,也可以通过 ssh 访问本地帐户,或者功能更齐全的东西,具体取决于您当地的要求。
然后您将像这样设置本地工作副本:
$ git clone http://localrepository/someproject.git
$ cd someproject
$ git remote set-url --push http://github.com/someuser/someproject.git
这会将每个存储库设置为从本地缓存中拉,但将更改推送到上游 github。
查看
git clone --reference-if-able
从另一个(在您的情况下是现场)存储库中获取对象。
有这个项目 https://gitlab.com/grouperenault/git_cdn 是为这种用例而设计的