当前位置: 首页 > Web前端 > JavaScript

从头开始创建私服GitHub

时间:2023-03-27 17:57:07 JavaScript

背景你是否好奇github-likeplatform代码管理平台背后的运行原理?让我们探索并开始开发我们自己的GitHub。市面上有几个开源项目我们可以部署私有git服务。项目开发语言地址为gitlabrubyhttps://gitlab.com/gitlab-org...gogsgohttps://github.com/gogs/gogsgiteagohttps://github.com/go-gitea/g...下面是什么我在使用这些项目搭建私有git服务时遇到的问题是gitlab对机器的性能有一定的要求。像RaspberryPi(我的4b[4G])这样的系统安装后经常会死机。安装要求详见:https://docs.gitlab.cn/jh/ins...gogs的运行对机器性能要求不高,但基于go语言开发。作为前端开发人员,不利于二次功能扩展。热情,于是着手打造一个前端开发者友好的git代码管理平台【Xunxincode】开源地址:https://github.com/lzuntalented/lz-git示例网站:http://git.lzz.show/lz/lz-git原理分析其实这些平台的本质都是远程执行git命令。当我们在本地操作页面或执行git命令时,我们将请求内容发送到远程服务器。这些平台帮助我们在服务器上执行git命令。例如:我们在页面上创建项目时,实际上是在服务器上执行了gitinit命令。如果你安装了git,通过命令gitclonedir(dir指本地任何一个git项目的目录路径)克隆一个仓库,所有的git命令都可以在dir目录下操作,实现技术项目结构:lerna前端:Typescript+react+antd后端:Nestjs+mysql项目架构创建一个项目,我们可以使用命令gitinit--bare[repositories]创建一个空仓库。多人协作时,作为仓库中心使用。比如创建一个博客仓库。执行命令gitinit--bareblog。(如下图上方红框所示)我们平时clone一个项目的时候,本地目录下会多出一个.git隐藏目录,--bare参数创建的仓库没有.git目录,而是直接将.git目录下的内容展开到当前仓库目录下,不会有工作文件。git,这个其实没什么意思,就是一个git仓库,我们在从GitHub克隆一个项目的时候可以发现,他们提供的克隆地址也有.git仓库。端服务器无法通过dir克隆,所以我们使用http方式的clone方式#体验示例站点克隆项目功能gitclonehttp://git.lzz.show/lz/lz-git.git然后我们在执行gitclone命令过程中发生了什么,参见:https://git-scm.com/docs/http...向远端发送一个路径为/info/refs?service=git-upload-pack的GET请求获取远程仓库的参考信息。http服务收到这个请求后,在远程仓库下执行命令gitupload-pack--stateless-rpc--advertise-refsremote/repository/dir,并将命令输出作为http响应返回给客户端客户端发起POST请求,路径为/git-upload-pack,获取远程资源。http服务收到这个请求后,在远程仓库repository/dir中执行命令gitupload-pack--stateless-rpcremote/,并将命令输出作为http响应返回给客户端。命令执行后,gitpush命令的执行过程与clone命令过程类似,只是服务参数由git-upload-pack变为git-receive-pack,git命令的参数由upload-pack变为收包问题记录。由于git发起的HTTP请求头中的Content-Type是非标准头,express无法自动解析请求体中的body。我们需要自定义中间件来解析bodyexport函数header(req:Request,res:Response,next:NextFunction){if(req.header('Content-Type'.toLowerCase())==='a应用程序/x-git-upload-pack-request'||req.header('Content-Type'.toLowerCase())==='application/x-git-receive-pack-request'){constbody=[];req.on('data',(chunk)=>{body.push(chunk);}).on('end',()=>{//将body转换为缓冲区格式有利于使用body内容作为输入}else{next();}};最后,我们搭建了一个基于Javascript开发的git代码管理平台,后续我们会继续对接Github,完善功能,如果你觉得这篇文章对你有用,请点个赞给项目点?开源地址历史项目【XiXinXiu】开篇-开源微场景编辑器从零开始入门-基础流程图编辑库