UtopiaXC Blog - Git
type: channel
link: https://blog.utopiaxc.com/tag/Git/
items: Git入门指南
items: 使用Docker部署自己的GitLab

Git入门指南
type: item
date: 2022-01-05T22:47:00+08:00
description: 零、引很多时候，有人用网盘共享代码，或者直接打一个归档发送代码的时候，我都十分头疼，说，为什么你不用Git，就会有人问我，Git到底是什么，更有甚者完全不知道Git，GitHub，GitLab甚至Gitee之间的区别，中间都沾染了一个Git，便慌了手脚，不知其所以。没耐心时，我便解释道，Git是存代码的网盘，显然，这么解释并不准确。然而，对于没接触过版本控制的人或初学者，Git和GitHub甚至是划等号的，理解为代码云盘，其实并不然。一、何为版本控制那么究竟什么是版本控制（VCS，Version Control System），Wiki百科的定义是“维护工程蓝图的标准作法，能追踪工程蓝图从诞生一直到定案的过程。此外，版本控制也是一种软件工程技巧，借此能在软件开发的过程中，确保由不同人所编辑的同一程序文件都得到同步”。好家伙，我直接你说这个谁懂啊.jpg所以，为了容易理解，我们想象这样一个场景。当你在写毕业论文的时候，慷慨挥洒数万字，一交查重红一半。这时候我们就需要对我们的论文进行修改，将重复的部分修正掉，然而，这就面临着一个问题，我们究竟是在原来的文件上直接修改并覆盖，还是另存成另一个文件呢。大概率，我们是舍不得我们死掉数亿脑细胞憋出来的奇怪文字的，于是乎，另存为，重命名一气呵成：毕业论文2.0.docx，毕业论文2.1.docx，毕业论文2.1最终版.docx，毕业论文2.1最终绝对不改版.docx，毕业论文2.1最终绝对不改版-副本.docx。一同操作之下，我们的毕业论文终于写好了，而我们的文件夹里多出了一堆莫名其妙的中间状态的文件，你说删也不是，万一哪天需要回溯查一下以前的日志呢；不删吧，乱七八糟，什么名字都有。更可怕的是，这些论文不仅是你自己改的，甚至还有你的导师直接帮你修改的部分片段，这下你犯了难，到底哪些是教授改的，那些是自己改的，到底要留哪些文档？于是乎，你想到了一个绝妙的办法，那我何不直接只留一份文档，然后另外建一个表格，只要记录每次的修改内容不就得了。这是一个好办法，这也就是系统化的版本控制系统的雏形，就像下面这张表格。提交ID修改的文件修改内容修改人修改时间f0cf2288毕业论文.docx新增：创建文件xxx学生2022-01-05 15:00:00 ( UTC +8)7e59772a开题报告.docx新增：关于背景的研究xxx学生2022-01-05 15:00:00 ( UTC +8)8d90d5f5毕业论文.docx修改：变更标题为xxxxxx教授2022-01-05 16:00:00 ( UTC +8)d271eceb毕业论文.docx新增：实验数据xxxxxx学生2022-01-05 16:30:00 ( UTC +8)c72f6412毕业论文.docx修改：实验数据xxx为xxxxxx教授2022-01-05 17:30:00 ( UTC +8)7c0e4c8d开题报告.docx修改：变更标题为xxxxxx教授2022-01-05 18:00:00 ( UTC +8) 这样，我们只需要保存最新版本的文件，而期间的全部修改，将有版本控制系统进行，在上面这个例子中，这个系统便是这个记录变化的表格。根据此，我们可以发现，版本控制系统首先它可以保存最新版本的文件，一般称这个保存文件的空间为仓库；它可以记录每次修改的内容，一般称为提交（commit）；它可以多人协同工作，即多个人维护同一个仓库中的文件。二、为什么选择Git现在，我们已经了解了什么是版本控制，那么我们到底应该用哪个版本控制软件呢？根据上文，我们了解到，其实版本控制只是一个“标准工作流程”，或者说是一种方法，那么为了实现这种方法，我们自然需要一个软件的帮助，不然每个代码文件我们都用excel表格来记录变化那岂不是脑子有点毛病。其实，版本控制软件有很多，比如Git的爹BitKeeper，CVS，以及后面的SVN。然而，在一众版本控制软件中，Git最终脱颖而出，成为这个时代的主流，这不乏其中的历史原因（有兴趣可以了解一下当年BitKeeper与Linux与Linus与Git的历史）。然而除了历史原因之外，也因为Git的本身设计足够优秀，我们简单对比一下Git与风靡一时的SVN便可一窥究竟。不同点GitSVN部署方式分布式集中式数据备份分布式备份服务端全量备份同步可提交在本地后与其他服务器或用户同步依赖部署SVN的服务器分支自行创建的分支不会影响其他用户且速度较快创建分支将影响全体用户且每次变化将引起所有用户同步冲突处理不中断提交，标记冲突文件，解决冲突中断提交，后提交者需要自行解决冲突后重新提交托管平台有，且很多，且有诸多大企业背书有，但少，且可靠性差我们可以看出来，Git的一大特点即分布式，即每个使用者在本地机器上安装Git后，创建或拉取仓库…

使用Docker部署自己的GitLab
type: item
date: 2021-12-30T22:59:00+08:00
description: 垃圾Gitee狗都不用今天早上收到一封邮件，居然是Gitee发来的，我一看，好家伙，给我仓库封了，理由是侵权。当初这个仓库就是随手写的模拟我们学校疫情期间的出校请假证明，而且写完之后学校系统就升级了我这个就没用了，一直放在GitHub上面没管。后面有一次学校实训，非要用Gitee提交代码，我就顺手把GitHub上面的仓库都同步过来了，好家伙，我都一年多没上了，这会告诉我我仓库给我封了。我深深地对国内这些托管机构产生了信任危机，当机立断发邮件要求删除我的被封仓库并注销我的账户。被封邮件GitLab由于GitHub有的时候不挂代理真的太慢了，在国内给别人看代码实在不方便，而且还准备教工作室的学弟学妹们用这些，所以萌生了一个自己部署Git托管的想法。上一家离职的公司代码托管是自己部署的GitLab，用着也算是熟了。之前一直没自己部署是因为没有啥性能靠谱的服务器，这次是趁着年底，买了个天翼云的8H16G的机子，然后把mc放到那上面去了，这样我原来的4H8G的腾讯云的机器就闲下来了，我寻思还不如找点东西部署上去，正好要一个Git托管，就放在这上面好了。部署GitLab分两个版本，一个是企业版，就是GitLab EE，一个是社区版，GitLab CE。EE的话多了一些功能（其实具体的我也不知道多了啥，想知道去官方看文档吧。反正我就仓库管理流水线啥的标准版也有）。查了半天CE其实是EE的非空真子集，而且EE不激活订阅的话CE的功能一样也能用，所以这里建议直接部署EE，反正也没什么损失，万一以后想订阅了呢。部署方式部署方式的话有两种，一个是用官方的脚本直接把服务部署在系统上，另一种是用docker。考虑到未来迁移、维护的一些问题，我选择了docker部署。安装dockerdocker的安装直接使用官方提供的脚本即可sudo curl -sSL get.docker.com | sh如果希望使用docker compose的话可以再装一个，我用的是pip安装的（需要python3）（虽然后面我也没用到这玩意部署所以你也可以不用）pip3 install docker-compose获取镜像不少人获取的是非官方的中文镜像，其实没必要，官方的汉化已经达到95%了，不过需要用户自己更改自己的语言，网站默认还是英文。docker pull gitlab/gitlab-ee # 这里要是不想装EE的话，后面的ee改成ce就行 启动服务事先找个路径，创建三个文件夹，比如在/home下，创建一个gitlab文件夹，在gitlab文件夹下创建config、logs、data这三个文件夹用于保存docker映射出的文件由于gitlab自带nginx和数据库PostgreSQL ，我们需要将其暴露出来并作反向代理。docker run -d \ # 启动docker --hostname git.utopiaxc.cn \ # 规定域名 -p 8443:443 \ # 建立docker端口映射以便后面做反向代理，将SSL的443端口映射到主机8443 -p 880:80 \ # 将Nginx的80端口映射到主机880 -p 822:22 \ # 将SSH的22端口映射到主机822 --name gitlab \ # docker服务命名，起什么都可以 --restart always \ # 崩溃自动重启设置为一直 -v xxx/config:/etc/gitlab \ # 将配置文件路径映射出来，xxx为上面提到的路径，如/home/gitlab -v xxx/logs:/var/log/gitlab \ # 将日志文件路径映射出来方便后续查找问题 -v xxx/data:/var/opt/gitlab \ # 将数据目录映射出来方便管理与迁移 -m 5000M \ # 最小内存，这里建议设置超过2000M，我一共8G所以设置了5G --memory-swap=5000M \ # 最小交换内存，这里不得小于最小内存 gitlab/gitlab-ee:latest # 指定docker镜像，即我们上面拉取到的最新版的gitlab镜像执行完这个巨长的shell之后，我们的gitlab服务就启动好了，我们直接通过域名的880端口就可以访问到了。默认管理员账户为root，初始密码在config文件夹中的initial_root_password文件中。（启动会有点慢，虽然已经显示启动成功但是访问的时候还是会显示502，这时的502是带有gitlab标志的502，稍等片刻即可）反向代理我们使用主机的nginx反向代理gitlab服务，注意这里反代的域名和上面启动gitlab的域名要一致。以下为nginx反代配置文件。#PROXY-START/ location ^~ / …