Git本地远程仓库

1. GitLab服务器简介

1.GitLab分类

  • 使用GitHub或者码云等公共代码仓库
  • 使用GitLab私有仓库

2.GitLab是什么?

是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。基础功能免费,高级功能收费。

3.为什么要使用GitLab?

  • 基础功能开源,可自行搭建
  • 可以进行权限控制,使得代码对部分人可见
  • gitlab使用方便

2. GitLab安装

主机名

IP

备注

git01

192.168.200.31

GitLab服务器

git02

192.168.200.32

Git客户端一

git03

192.168.200.33

Git客户端二

2.1 安装GitLab

官方安装文档:https://about.gitlab.com/installation/#centos-7

GitLab国内源下载地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/

#根据需要下载GitLab安装包
[root@git01 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.3.5-ce.0.el7.x86_64.rpm

[root@git01 ~]# yum -y localinstall gitlab-ce-12.3.5-ce.0.el7.x86_64.rpm 

重要说明:
yum localinstall 利用yum安装本地指定的rpm包,好处是自动解决依赖问题

2.2 初始化GitLab

[root@git01 ~]# gitlab-ctl reconfigure
#以下省略若干。。。

#查看gitlab启动状态
[root@git01 ~]# gitlab-ctl status
run: alertmanager: (pid 3561) 49s; run: log: (pid 3267) 104s
run: gitaly: (pid 3407) 53s; run: log: (pid 2685) 209s
run: gitlab-exporter: (pid 3454) 51s; run: log: (pid 3192) 122s
run: gitlab-workhorse: (pid 3430) 53s; run: log: (pid 3017) 160s
run: grafana: (pid 3578) 48s; run: log: (pid 3386) 65s
run: logrotate: (pid 3058) 146s; run: log: (pid 3068) 142s
run: nginx: (pid 3031) 157s; run: log: (pid 3042) 154s
run: node-exporter: (pid 3444) 52s; run: log: (pid 3131) 126s
run: postgres-exporter: (pid 3570) 48s; run: log: (pid 3296) 98s
run: postgresql: (pid 2796) 206s; run: log: (pid 2853) 203s
run: prometheus: (pid 3464) 50s; run: log: (pid 3240) 110s
run: redis: (pid 2642) 214s; run: log: (pid 2652) 213s
run: redis-exporter: (pid 3457) 51s; run: log: (pid 3219) 114s
run: sidekiq: (pid 2981) 169s; run: log: (pid 2995) 166s
run: unicorn: (pid 2952) 175s; run: log: (pid 2973) 174s

2.3 GitLab中文社区版补丁包安装

GitLab中文社区:https://gitlab.com/xhang/gitlab/tree/11-2-stable-zh

#解压GitLab中文版补丁包
[root@git01 ~]# tar xf gitlab-12-3-stable-zh.tar.gz

#查看系统已经安装的GitLab版本号
[root@git01 ~]# cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
12.3.5

#查看解压后的补丁包版本号
[root@git01 ~]# cat gitlab-12-3-stable-zh/VERSION 
12.3.5

说明:
补丁包版本号和安装的GitLab版本号需要一致
#备份英文版GitLab
[root@git01 ~]# cp -r /opt/gitlab/embedded/service/gitlab-rails{,.bak}

#将中文补丁包的内容覆盖英文版
[root@git01 ~]# /bin/cp -rf gitlab-12-3-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails/

2.4 修改GitLab配置文件/etc/gitlab/gitlab.rb

我们需要修改GitLab的默认访问域名(因为我们是在内网搭建的GitLab)
GitLab默认的监听端口为80,但是在企业中,这个端口经常被别的服务占用,所以我们还需要更换端口号

[root@git01 ~]# cp /etc/gitlab/gitlab.rb{,.bak}

[root@git01 ~]# vim /etc/gitlab/gitlab.rb
[root@git01 ~]# cat /etc/gitlab/gitlab.rb | sed -n "13p;1105p"
external_url 'http://192.168.200.31:88'
nginx['listen_port'] = 88
#重新配置GitLab
[root@git01 ~]# gitlab-ctl reconfigure
#以下省略若干。。。

#重启动GitLab
[root@git01 ~]# gitlab-ctl restart
ok: run: alertmanager: (pid 4721) 0s
ok: run: gitaly: (pid 4733) 0s
ok: run: gitlab-exporter: (pid 4751) 0s
ok: run: gitlab-workhorse: (pid 4759) 1s
ok: run: grafana: (pid 4766) 1s
ok: run: logrotate: (pid 4778) 0s
ok: run: nginx: (pid 4786) 1s
ok: run: node-exporter: (pid 4791) 0s
ok: run: postgres-exporter: (pid 4799) 1s
ok: run: postgresql: (pid 4809) 0s
ok: run: prometheus: (pid 4821) 1s
ok: run: redis: (pid 4846) 0s
ok: run: redis-exporter: (pid 4852) 1s
ok: run: sidekiq: (pid 4866) 0s
timeout: run: unicorn: (pid 2951) 460s

2.5 在宿主机输入http://192.168.200.31:88地址就可以访问了

gitlab和远程仓库连接 gitlab远程仓库地址_linux

gitlab和远程仓库连接 gitlab远程仓库地址_linux_02

2.6 创建一个项目

gitlab和远程仓库连接 gitlab远程仓库地址_java_03

gitlab和远程仓库连接 gitlab远程仓库地址_gitlab和远程仓库连接_04

gitlab和远程仓库连接 gitlab远程仓库地址_gitlab和远程仓库连接_05

2.7 尝试将本地仓库代码推送到私有GitLab

1.提交到本地仓库

#创建git仓库并初始化
[root@git02 ~]# mkdir /mycode
[root@git02 ~]# cd /mycode/
[root@git02 mycode]# git init
初始化空的 Git 版本库于 /mycode/.git/
[root@git02 mycode]# echo "远程提交测试" > test.txt
[root@git02 mycode]# cat test.txt 
远程提交测试
#Git全局配置
[root@git02 mycode]# git config --global user.name "Mr.yang"
[root@git02 mycode]# git config --global user.email "1773464408@qq.com"
#提交到本地仓库
[root@git02 mycode]# git add test.txt 
[root@git02 mycode]# git commit -m "第一次远程提交测试"
[master(根提交) 06cd049] 第一次远程提交测试
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt

2.推送本地仓库master分支到远程仓库GitLab上

[root@git02 mycode]# git branch
* master    #当前在master分支

#添加远程GitLab仓库管理
[root@git02 mycode]# git remote add origin http://192.168.200.31:88/root/ceshi.git
[root@git02 mycode]# git remote -v
origin	http://192.168.200.31:88/root/ceshi.git (fetch)
origin	http://192.168.200.31:88/root/ceshi.git (push)

#推送本地仓库master分支到远程仓库GitLab上
[root@git02 mycode]# git push origin master
Username for 'http://192.168.200.31:88': root
Password for 'http://root@192.168.200.31:88': ywb971108
Counting objects: 3, done.
Writing objects: 100% (3/3), 258 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://192.168.200.31:88/root/ceshi.git
 * [new branch]      master -> master

gitlab和远程仓库连接 gitlab远程仓库地址_linux_06

gitlab和远程仓库连接 gitlab远程仓库地址_gitlab和远程仓库连接_07

3.推送本地仓库dev分支到远程仓库GitLab上

#创建并接环到dev分支
[root@git02 mycode]# git branch dev
[root@git02 mycode]# git checkout dev
切换到分支 'dev'
[root@git02 mycode]# git branch
* dev
  master
[root@git02 mycode]# echo "dev远程提分支交测试" >> test.txt 
[root@git02 mycode]# cat test.txt 
远程提交测试
dev远程提分支交测试

[root@git02 mycode]# git add test.txt 
[root@git02 mycode]# git commit -m "dev远程提分支交测试"
[dev ab5e6c0] dev远程提分支交测试
 1 file changed, 1 insertion(+)
#推送本地仓库dev分支到远程仓库GitLab上
[root@Git01 mycode]# git push origin dev
Username for 'http://192.168.200.53:8888': root
Password for 'http://root@192.168.200.53:8888': ywb971108
对象计数中: 3, 完成.
写入对象中: 100% (3/3), 306 bytes | 0 bytes/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
remote: 
remote: To create a merge request for dev, visit:
remote:   http://192.168.200.53:8888/root/yunjisuan/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote: 
To http://192.168.200.53:8888/root/yunjisuan.git
 * [new branch]      dev -> dev

gitlab和远程仓库连接 gitlab远程仓库地址_gitlab和远程仓库连接_08

gitlab和远程仓库连接 gitlab远程仓库地址_git_09

4.推送本地仓库标签V1.0到远程仓库GitLab上

[root@git02 mycode]# echo "打个标签" >> test.txt
[root@git02 mycode]# cat test.txt 
远程提交测试
dev远程提分支交测试
打个标签

[root@git02 mycode]# git add test.txt 
[root@git02 mycode]# git commit -m "标签测试"
[dev 21ccadf] 标签测试
 1 file changed, 1 insertion(+)
#创建标签
[root@git02 mycode]# git tag v1.0
[root@git02 mycode]# git tag
v1.0

#推送本地仓库标签V1.0到远程仓库GitLab上
[root@git02 mycode]# git push origin v1.0
Username for 'http://192.168.200.31:88': root
Password for 'http://root@192.168.200.31:88': 
Counting objects: 5, done.
Writing objects: 100% (3/3), 288 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://192.168.200.31:88/root/ceshi.git
 * [new tag]         v1.0 -> v1.0

gitlab和远程仓库连接 gitlab远程仓库地址_java_10

gitlab和远程仓库连接 gitlab远程仓库地址_gitlab和远程仓库连接_11

2.8 尝试在本地仓库克隆GitLab的项目dev分支到本地仓库

#创建Git工作目录
[root@git03 ~]# mkdir /mycode
[root@git03 ~]# cd /mycode/
#克隆远程仓库GitLab的dev分支
[root@git03 mycode]# git clone -b dev http://192.168.200.31:88/root/ceshi.git
正克隆到 'ceshi'...
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 9 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (9/9), done.
#查看结果
[root@git03 mycode]# ls
ceshi
[root@git03 mycode]# cd ceshi/

[root@git03 ceshi]# ls
test.txt
[root@git03 ceshi]# cat test.txt 
远程提交测试
dev远程提分支交测试

2.9 配置GitLab的SSH密钥连接方式

#在Git03客户端生成密钥对 
[root@git03 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:sTppVfJqIMMJiqM5GIdx8Aa3mVp3EJUuO/gsgQgsmbY root@git03
The key's randomart image is:
+---[RSA 2048]----+
|o . oo..         |
| = + ..          |
|ooX ... o .      |
|*@ +.o.  *       |
|%.o.=o. S .      |
|=Eo oo = .       |
|=  + .= o        |
| .. o. o         |
|   .             |
+----[SHA256]-----+
#公钥内容,复制到GitLab上
[root@git03 ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC2Sykv/orgH0qzPYj7K/B9j+AQsgmSTj5yIGjDynJL/F2kkRAIFnZdJw39XwZN0h6Eh4wVLPadK0+RSVzMRnM6hE9V4Q5LkXIvcD0LmtMPsDcAfgJhcxrzsj0i+dB1qv0oe97TLujzSoQgl6ILfm5GSPWohmDIJY1UvBZpahB5FF+hoq+8vLrqDy1q25w5l8UywGDOcj43bd7oLNceJfpVlgsG7IC1q8UBawy7NnOzwSBKAV5evnKhcLP6DqtkeVKJKJdGgkEMrvsn6SkfyQ0xt/4EZ+NCQahfLMqyXez+sJk7pan1EAMKJX6Pdd6pV4dwL2GhJ6LE4dP8VfBkvV8X root@git03

在浏览器端打开GitLab http://192.168.200.31:88

gitlab和远程仓库连接 gitlab远程仓库地址_linux_12

gitlab和远程仓库连接 gitlab远程仓库地址_gitlab_13

gitlab和远程仓库连接 gitlab远程仓库地址_git_14

2.10 利用ssh方式克隆GitLab上的一个项目

[root@git03 ~]# mkdir /mycode
[root@git03 ~]# cd /mycode/
#将远程GitLab的Linux分支克隆到本地
[root@git03 mycode]# git clone -b master git@192.168.200.31:root/ceshi.git
正克隆到 'ceshi'...
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 9 (delta 0), reused 0 (delta 0)
接收对象中: 100% (9/9), done.
[root@git03 mycode]# ls
ceshi
[root@git03 mycode]# ls ceshi/
test.txt
[root@git03 mycode]# cat ceshi/test.txt 
远程提交测试

[root@Git01 yunjisuan]# git branch
* dev

3. 配置GitLab邮件服务

配置邮箱服务的用途:

  • 有合并请求时,邮件通知
  • 账号注册时,邮件验证
  • 修改密码时,通过邮件修改

配置步骤:

  • 开启QQ邮箱的smtp服务
  • 修改gitlab配置
  • 测试邮件服务是否正常

3.1 开启GitLab服务postfix服务并开启QQ邮箱的smtp服务

[root@git01 ~]# systemctl start postfix
[root@git01 ~]# systemctl enable postfix
[root@git01 ~]# systemctl status postfix | grep Active
   Active: active (running) since 五 2021-03-12 09:47:29 CST; 3 days ago

gitlab和远程仓库连接 gitlab远程仓库地址_linux_15

gitlab和远程仓库连接 gitlab远程仓库地址_gitlab_16

3.2 修改gitlab配置文件/etc/gitlab/gitlab.rb

[root@git01 ~]# vim /etc/gitlab/gitlab.rb
[root@git01 ~]# cat -n /etc/gitlab/gitlab.rb | sed -n '53p;559,567p;725p'
    53	gitlab_rails['gitlab_email_from'] = '1773464408@qq.com'   #GitLab默认邮箱
   559	gitlab_rails['smtp_enable'] = true    #开启功能
   560	gitlab_rails['smtp_address'] = "smtp.qq.com"   #QQ的smtp服务
   561	gitlab_rails['smtp_port'] = 465
   562	gitlab_rails['smtp_user_name'] = "1773464408@qq.com"   #smtp用户邮箱
   563	gitlab_rails['smtp_password'] = "nhfbyhkzwxkpdafh"     #开通QQsmtp时返回的字符串
   564	gitlab_rails['smtp_domain'] = "qq.com"                 #smtp域名
   565	gitlab_rails['smtp_authentication'] = "login"
   566	gitlab_rails['smtp_enable_starttls_auto'] = true
   567	gitlab_rails['smtp_tls'] = true
   725	user['git_user_email'] = "1773464408@qq.com"           #git用户邮箱
#重新加载GitLab配置文件
[root@git01 ~]# gitlab-ctl reconfigure
#以下省略若干。。。

#重启动GitLab服务
[root@git01 ~]# gitlab-ctl restart
ok: run: alertmanager: (pid 35165) 0s
ok: run: gitaly: (pid 35178) 0s
ok: run: gitlab-exporter: (pid 35195) 0s
ok: run: gitlab-workhorse: (pid 35197) 1s
ok: run: grafana: (pid 35206) 0s
ok: run: logrotate: (pid 35217) 1s
ok: run: nginx: (pid 35225) 0s
ok: run: node-exporter: (pid 35230) 1s
ok: run: postgres-exporter: (pid 35239) 0s
ok: run: postgresql: (pid 35247) 0s
ok: run: prometheus: (pid 35256) 0s
ok: run: redis: (pid 35263) 0s
ok: run: redis-exporter: (pid 35270) 1s
ok: run: sidekiq: (pid 35275) 0s
ok: run: unicorn: (pid 35283) 0s
#进入GitLab控制台进行邮件发送测试
[root@git01 ~]# gitlab-rails console      #开启GitLab控制台
--------------------------------------------------------------------------------
 GitLab:       12.3.5 (2417d5becc7)
 GitLab Shell: 10.0.0
 PostgreSQL:   10.9
--------------------------------------------------------------------------------
Loading production environment (Rails 5.2.3)
irb(main):001:0> Notify.test_email('1773464408@qq.com','this is title','hello,杨哥!').deliver_now
Notify#test_email: processed outbound mail in 64.1ms
#以下省略。。。

特别说明:
Notify.test_email('收件人邮箱','邮件标题','邮件内容')

gitlab和远程仓库连接 gitlab远程仓库地址_git_17

gitlab和远程仓库连接 gitlab远程仓库地址_gitlab_18

4. GitLab的账号注册及分组

4.1 账户注册测试 http://192.168.200.31:88

gitlab和远程仓库连接 gitlab远程仓库地址_git_19

gitlab和远程仓库连接 gitlab远程仓库地址_gitlab和远程仓库连接_20

我们再注册的时候,用的是乱写的邮箱都能注册并登陆;
显然这在企业里是绝对不允许的。

4.2 开启GitLab邮箱验证功能

1.重新登陆管理员用户,我们进行如下操作

gitlab和远程仓库连接 gitlab远程仓库地址_gitlab_21

2.然后我们退出管理员的登陆,重新进行重新注册

gitlab和远程仓库连接 gitlab远程仓库地址_java_22

gitlab和远程仓库连接 gitlab远程仓库地址_linux_23

3.由上图,我们发现,此时注册用户,已经进不去GitLab了;
这是因为GitLab已经自动发了一封邮件给注册用户的邮箱,需要用户进行邮件确认后,方可登陆

gitlab和远程仓库连接 gitlab远程仓库地址_java_24

gitlab和远程仓库连接 gitlab远程仓库地址_linux_25

gitlab和远程仓库连接 gitlab远程仓库地址_git_26

4.3 创建一个项目组

gitlab和远程仓库连接 gitlab远程仓库地址_git_27

gitlab和远程仓库连接 gitlab远程仓库地址_git_28

gitlab和远程仓库连接 gitlab远程仓库地址_gitlab_29

gitlab和远程仓库连接 gitlab远程仓库地址_gitlab和远程仓库连接_30

  • Guest访客: 只能发表评论,不能读写项目库
  • Reporter报告者: 只能克隆代码(读),不能提交代码(修改)(产品测试)
  • Developer开发人员: 可以进行代码的读写(普通程序员)
  • Master主程序员: 可以添加项目成员,添加标签,创建和保护分支(产品经理)
  • Owner所有者: 拥有所有权限(一般不用此权限)

添加权限成功后,GitLab会自动邮件通知这个用户

gitlab和远程仓库连接 gitlab远程仓库地址_linux_31

4.4 给项目组创建一个新项目

gitlab和远程仓库连接 gitlab远程仓库地址_gitlab_32

gitlab和远程仓库连接 gitlab远程仓库地址_java_33

4.5 进行组成员的项目提交和克隆测试

#进行组成员代码提交测试
[root@git03 ~]# mkdir /mycode
[root@git03 ~]# cd /mycode/

#进行克隆测试
[root@git03 mycode]# git clone http://192.168.200.31:88/uat/ceshi03.git
正克隆到 'ceshi03'...
Username for 'http://192.168.200.31:88': 3523916661@qq.com
Password for 'http://3523916661@qq.com@192.168.200.31:88': 123456789
warning: 您似乎克隆了一个空版本库。

[root@git03 mycode]# ls
ceshi03
[root@git03 mycode]# ls ceshi03/
[root@git03 mycode]#
#推送代码到远程GitLab
[root@git03 mycode]# cd ceshi03/
[root@git03 ceshi03]# echo "组成员项目提交测试" >> test.txt
[root@git03 ceshi03]# cat test.txt 
组成员项目提交测试

[root@git03 ceshi03]# git add test.txt 
[root@git03 ceshi03]# git config --global user.name "喜羊羊"
[root@git03 ceshi03]# git config --global user.email "3523916661@qq.com"
[root@git03 ceshi03]# git commit -m "组成员第一次提交测试"
[master(根提交) 16a13af] 组成员第一次提交测试
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt

[root@git03 ceshi03]# git push -u origin master
Username for 'http://192.168.200.31:88': 3523916661@qq.com
Password for 'http://3523916661@qq.com@192.168.200.31:88': 
Counting objects: 3, done.
Writing objects: 100% (3/3), 273 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://192.168.200.31:88/uat/ceshi03.git
 * [new branch]      master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。

gitlab和远程仓库连接 gitlab远程仓库地址_git_34

gitlab和远程仓库连接 gitlab远程仓库地址_gitlab和远程仓库连接_35