`
cryolite
  • 浏览: 578122 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

建个github的本地中转站

阅读更多
局域网内有多台开发机器,因为网络的原因,从github拉取更新时总是失败,这台成功了那台又不行;还有个原因是网络速度,拉取的工程有81M,网络传输也不快。于是琢磨在本地建个github的镜像库,所有机器都统一clone自这个本地镜像库里,然后由这个镜像库负责与github更新。

cd /storage/mirror_github/
git clone --mirror git://github.com/xxx/yyy.git


这样在本地/storage/mirror_github/yyy.git建立了github上yyy项目的一个镜像了,这是一个裸版本库(裸版本库一般约定以.git为后缀)。

在工作路径下,都从本地github库克隆:
cd /home/bob/workspace/
git clone file:///storage/mirror_github/yyy.git

......
git commit -m "balabala"

提交工作,然后本地推送更新到本地镜像库。
git push

进入镜像库,然后推送更新到github
cd /storage/mirror_github/yyy.git
git push

当有人在外地开发并将代码提交到github后,我们在本地镜像库中更新github
cd /storage/mirror_github/yyy.git
git fetch

注意这里必须用git fetch拉取更新镜像库。
然后所有局域网内开发机就可以从镜像库中同步了

这样局域网内就以本地镜像为中转与github间更新了。
对于rebar的依赖管理会有点麻烦,我们得再写个本地deps的rebar.mirror.config,每次rebar get-deps时指定这个配置文件
rebar -C rebar.mirror.config

但是对依赖的依赖比较麻烦,写了个rebar的插件解决这一问题。

主要想法是抢在在git clone运行之前通过sed将所以github.com换成本地的git镜像库地址。sed命令如下:
sed -E 's/(git|https):\/\/github.com/ssh:\/\/file:\/\/\/storage\/github-repos/g'

rebar先获取项目根目录下所有的依赖项目,然后进入每个依赖项目,获取每个依赖的依赖。
这个替换操作在每次rebar get-dep执行之后执行
'post_get-deps'(_Config, _AppFile) ->
    BaseDir = rebar_config:get_global(base_dir, undefined),
    RelDir = filename:join(BaseDir, "rel"),
    DepsDir = rebar_config:get_global(deps_dir, "deps"),
    CD = rebar_utils:get_cwd(),
    rebar_log:log(debug, "pWD: ~p, Base_Dir: ~s, Deps_Dir: ~s~n", [CD, BaseDir, DepsDir]),

    case lists:prefix(RelDir, CD) of
        true ->
            ok;
        false ->
            [ update_rebar_cfg_by_sed(Dep) || Dep <- rebar_config:get_local(Config, deps, [])],
            ok
    end.

update_rebar_cfg_by_sed(Dep) ->
    rebar_log:log(debug, "dEp: ~p~n", [Dep]),
    Da = erlang:element(1, Dep),

    BaseDir = rebar_config:get_global(base_dir, undefined),
    DepsDir = rebar_config:get_global(deps_dir, "deps"),
    CD = rebar_utils:get_cwd(),

    RC = filename:join([BaseDir, DepsDir, Da]),
    rebar_log:log(debug, "pwd: ~p, base_dir: ~s, deps_dir: ~s, RC = ~s~n", [CD, BaseDir, DepsDir, RC]),

    rebar_utils:sh("sed -E -f " ++ ?LAN_SED(BaseDir) ++ " " ++ filename:join(RC, "rebar.config") ++ " > /tmp/rebar.config", []),
    rebar_utils:sh("mv /tmp/rebar.config " ++ RC, []).



有个比较特殊的依赖(eleveldb)是通过脚本build_deps.sh获取其依赖的。需要将脚本中的github地址替换成本地。而且要在这个依赖的脚本执行之前将地址替换掉:
'pre_get-deps'(_Config, _AppFile) ->
    BaseDir = rebar_config:get_global(base_dir, undefined),
    DepsDir = rebar_config:get_global(deps_dir, "deps"),
    CD = rebar_utils:get_cwd(),
    case lists:prefix(filename:join([BaseDir, DepsDir, eleveldb]), CD) of
        true ->
            rebar_utils:sh("sed -E -f " ++ ?LAN_SED(BaseDir) ++ " c_src/build_deps.sh > /tmp/build_deps.sh", []),
            rebar_utils:sh("chmod +x /tmp/build_deps.sh", []),
            rebar_utils:sh("mv /tmp/build_deps.sh " ++ filename:join(CD, c_src), []);
        false ->
            skip
    end,
    ok.



此外,需要在根项目的rebar.config文件中指定插件:
echo '{plugin_dir, "lan"}.' >> rebar.config
echo '{plugins, [lan_deps_plugin]}.' >> rebar.config


参考:rebar插件指南



分享到:
评论

相关推荐

    github上传本地文件方法.rar

    在IT行业中,GitHub是一个非常重要的版本控制和协作平台,它允许开发者存储、管理和分享代码。本文将详细讲解如何将本地文件上传到GitHub,这适用于所有希望通过GitHub分享代码或项目资料的用户。首先,我们需要安装...

    本地代码提交到GitHub步骤.docx

    在IT行业中,版本控制工具的重要性不言而喻,特别是对于软件开发团队而言,GitHub作为一个流行的开源托管平台,已经成为协作和代码存储的重要工具。本篇文章将详细介绍如何将本地代码提交到GitHub远程仓库的完整步骤...

    github安装工具

    在IT行业中,GitHub是一个至关重要的平台,它是一个用于版本控制和协作的分布式版本控制系统,尤其在软件开发领域,GitHub被广泛使用。为了更好地利用GitHub,我们需要安装其客户端工具,这里我们关注的是...

    如何快速将本地idea项目上传到github仓库

    这个过程可以分为四个步骤:创建 GitHub 空仓库、创建本地 Spring Boot 项目、将项目设置为 Git 仓库、提交到远程仓库。 创建 GitHub 空仓库 在将本地 IDEA 项目上传到 GitHub 仓库之前,需要先创建一个空仓库。这...

    hexo github page本地仓库代码

    Hexo是一个基于Node.js的静态站点生成器,广泛用于创建个人博客,特别是与GitHub Pages结合使用时。通过将Markdown格式的文本转换为静态HTML页面,Hexo提供了快速、简洁且高效的博客搭建方式。在GitHub Pages上托管...

    c++写的一个github快速下载器,clone速度可达10M/s

    c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++写的一个github快速下载器,clone速度可达10M/s c++...

    go github(使用github)

    创建项目仓库(repository)是第一步,之后用户可以将本地的Git仓库推送到GitHub上,或者从GitHub上克隆(clone)仓库到本地。 项目托管是GitHub的核心功能之一。用户可以创建公开或者私有的仓库来管理自己的项目。...

    GitHub 客户端

    1. **创建新仓库**:在 GitHub 客户端中,你可以新建一个本地仓库,然后将其与 GitHub 上的新仓库关联。这一步骤通常包括在 GitHub 网站上创建仓库,然后在客户端中添加远程仓库。 2. **克隆仓库**:如果你需要参与...

    github个人使用笔记

    1. 创建新仓库:在 Github 网站 new 一个仓库,然后 clone 到本地 2. 将原项目的修改同步到自己的分支:`git fetch`、`git merge`、`git push` 总结 Github 的个人使用笔记可以总结为以下几个步骤: 1. 完整流程...

    GitHub的使用方法

    GitHub是一个基于Git的版本控制和代码托管的平台,它允许开发者在云端创建、管理项目,协同开发,并进行代码分享。使用GitHub不仅可以帮助开发者更好地管理代码,还可以通过社交化的功能增强与他人合作的便利性。 ...

    github 使用指南 官方中文

    GitHub 是全球最大的开源软件托管平台,它为开发者提供了一个存储、分享和协作开发代码的平台。这份"GitHub 使用指南 官方中文"是 GitHub 官方提供的帮助文档,旨在帮助中文用户更好地理解和使用 GitHub。 一、...

    如何用git将本地项目push到GitHub上?

    如何用git将本地项目push到GitHub上?如何用git将本地项目push到GitHub上?

    github使用记录,

    7. 上传更改到GitHub:如果更改是在本地新创建的仓库而非网页上创建的仓库,需要一个GitHub上传工具(如Git命令行工具)来上传更改。否则,网页上的仓库不需要额外的上传工具。 8. 文档格式问题:在添加新的文本...

    Mac上将本地项目上传到GitHub仓库

    在Mac上将本地项目上传到GitHub仓库的过程涉及多个步骤,包括安装Git,配置GitHub账户,创建新仓库,以及使用命令行工具进行版本控制操作。以下是一个详细的指导: 1. **安装Git**: Git是分布式版本控制系统,是与...

    GitHub上传方法.docx

    标题中的“GitHub上传方法.docx”指的是在GitHub上创建并上传新项目的步骤,这是一个关于版本控制和代码托管的基础教程。以下是对这些步骤的详细解释: 首先,为了在GitHub上上传项目,你需要拥有一个GitHub账户。...

    GitHub for Windows

    GitHub 是一个基于云的代码托管平台,深受全球开发者喜爱,它提供了版本控制和协作功能,便于团队管理代码仓库。GitHub for Windows 是官方为Windows操作系统用户设计的一款客户端应用,使得在Windows环境下使用...

    GitHub Android App源码

    GitHub Android App 是一个官方出品的应用程序,允许用户在移动设备上无缝地浏览、管理以及协作开发GitHub上的项目。这款应用的源码是公开的,对于Android开发者而言,它是一个宝贵的资源,可以学习到GitHub客户端...

    从Github建remote远程项目

    本文将详细介绍如何通过GitHub建立一个远程项目,并通过SourceTree这一图形化Git客户端来进行项目的管理。 #### 二、创建GitHub远程仓库 1. **登录GitHub账户**:首先需要有一个GitHub账号,如果没有的话,需要先...

Global site tag (gtag.js) - Google Analytics