Git distributed version control system (under)

Git distributed version control system (under)

3. GIT branch management

Architectural Overview 3.1 branch

In the actual project development, as far as possible to ensure stable master branch, only to release a new version, which usually should not directly modify the data file.
Where does that work? Work in the dev branch. Everyone from dev branch to create your own personal branch, merge to complete the development dev branch, and finally dev branch into the master branch.
Therefore, cooperation branch team will look like the figure below.

image.png-88.8kB

Branch management workflow:

  • At work, in order to ensure stable master branch, product manager usually a copy of the code as a dev branch from the master branch;
  • A member then developed in a copy of the code is called michael from the dev branch;
  • Then members of the development of B and then copy the code from dev branch called the bob;
  • B-A and normal development push and pull on his personal code and bob at michael branch.
  • When development is completed a new feature, a bug or after the modification is completed. Developers will first code changes are pushed to their personal branch, and then merge the changes to individual branches in the dev branch;
  • When code development managers and testers pull dev branch of the test, if no problem, then developers will dev branch manager changes incorporated into the master version;
  • Finally, since the master version adds new features tested, then you need to be released or project on the line of code.

3.2 GIT local branch management

3.2.1 Create a local branch of the switch

  • git branch: branch view the current situation, there is an asterisk before the current branch
  • git branch dev: create a branch
  • git checkout: Check Changes differences local branch and a remote branch
  • git checkout dev: branch switching
#检查当前分支情况
[root@Git01 mycode]# pwd
/mycode
[root@Git01 mycode]# git branch
* master           #当前所处分支
[root@Git01 mycode]# git branch dev       #创建dev分支

[root@Git01 mycode]# git branch
  dev
* master           #当前所处分支
[root@Git01 mycode]# git checkout dev     #切换到dev分支
切换到分支 'dev'
[root@Git01 mycode]# git branch
* dev              #当前所处分支
  master

3.2.2 The code that attempts to submit the local branch in linux

[root@Git01 mycode]# git branch
* dev
  master

[root@Git01 mycode]# cat benet.txt 
www
www
www
[root@Git01 mycode]# echo "dev分支新增一行" >> benet.txt
[root@Git01 mycode]# cat benet.txt
www
www
www
dev分支新增一行

[root@Git01 mycode]# git add *
[root@Git01 mycode]# git status
位于分支 dev
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

    修改:     benet.txt
#此时我们先将改变提交到本地dev分支以后在切换分支
#将变更提交到本地dev分支
[root@Git01 mycode]# git branch
* dev
  master
[root@Git01 mycode]# git commit -m "dev第一次提交"
[dev 083024b] dev第一次提交
 1 file changed, 4 insertions(+)
[root@Git01 mycode]# cat benet.txt
www
www
www
dev分支新增一行         #dev分支比master分支新增一行数据

[root@Git01 mycode]# git checkout master
切换到分支 'master'
您的分支与上游分支 'test/master' 一致。
[root@Git01 mycode]# git branch
  dev
* master
[root@Git01 mycode]# cat benet.txt
www
www
www

Description:

  • We found that after switching branch, the branch in linux files modified data, completely restore the contents of the file becomes the master branch
  • But there is a problem here, if we have a branch in linux, modify the file, but has not been submitted to the local branch warehouse linux, but only into the staging area to switch to the master branch, then what happens?
#切换到dev分支
[root@Git01 mycode]# git checkout dev
切换到分支 'dev'
[root@Git01 mycode]# git branch
* dev
  master
[root@Git01 mycode]# cat benet.txt
www
www
www
dev分支新增一行

#再次新增一行数据
[root@Git01 mycode]# echo "dev分支新增第二行" >> benet.txt 
[root@Git01 mycode]# cat benet.txt
www
www
www
dev分支新增一行
dev分支新增第二行

#文件变更添加到暂存区
[root@Git01 mycode]# git add *
[root@Git01 mycode]# git status
位于分支 dev
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

    修改:     benet.txt
#切换分支master,但由于没有提交暂存区的改变,因此切换分支失败
[root@Git01 mycode]# git checkout master
error: Your local changes to the following files would be overwritten by checkout:
    benet.txt
Please commit your changes or stash them before you switch branches.
终止中

[root@Git01 mycode]# git branch
* dev              #依旧在dev分支
  master

Description:

  • When the local branch warehouses and master the local branch warehouse linux code is not the same, if you did not submit the change to the branch warehouse from scratch, then the default is not to switch branches.
  • But there's a problem, if the same local warehouse linux master branch and branch code, but I still did not submit the change to the local branch linux linux branch warehouse, then you can switch directly to the master branch?
#将本地分支master和dev的代码保存为一致。
[root@Git01 mycode]# git branch
  dev
* master
[root@Git01 mycode]# cat benet.txt 
www
www
www

[root@Git01 mycode]# git checkout dev
切换到分支 'dev'
[root@Git01 mycode]# git branch 
* dev
  master
[root@Git01 mycode]# cat benet.txt 
www
www
www
#在linux分支修改benet.txt文件
[root@Git01 mycode]# git branch 
* dev              #当前在dev分支
  master
[root@Git01 mycode]# echo "dev第一次修改" >> benet.txt 
[root@Git01 mycode]# cat benet.txt 
www
www
www
dev第一次修改

[root@Git01 mycode]# git add *
[root@Git01 mycode]# git status
位于分支 dev
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

    修改:     benet.txt
#切换到master分支
[root@Git01 mycode]# git checkout master
M   benet.txt
切换到分支 'master'
您的分支与上游分支 'test/master' 一致。
[root@Git01 mycode]# git branch 
  dev
* master           #当前在master分支

[root@Git01 mycode]# cat benet.txt 
www
www
www
dev第一次修改       #之前的修改仍旧存在

[root@Git01 mycode]# git status         #切换分支前的暂存区内容还在
位于分支 master
您的分支与上游分支 'test/master' 一致。
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

    修改:     benet.txt

Description:

  • If the code between the local branch of the same warehouse, so even if the change is not committed to the local branch of the warehouse, you can also switch branch, to pay attention to this point.
  • At work, in order to avoid accidents, before switching branches, be sure to first submit the staging area or empty.
#清空暂存区内容
[root@Git01 mycode]# git status
位于分支 master
您的分支与上游分支 'test/master' 一致。
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

    修改:     benet.txt


[root@Git01 mycode]# git reset     #清空暂存区内容
重置后取消暂存的变更:
M   benet.txt


[root@Git01 mycode]# git status
位于分支 master
您的分支与上游分支 'test/master' 一致。
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

    修改:     benet.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

3.3 combined with the local branch of deleted

  • Linux results of the work of trying to merge onto the master branch;
  • First switch to the master branch
  • git merge dev: dev branches merged into the master
  • git branch -d dev: determining the merger is completed, you can safely delete the dev branch.

3.3.1 automatically merge local branch

[root@Git01 mycode]# git branch
* dev              #处于dev分支
  master
[root@Git01 mycode]# cat benet.txt 
www
www
www
dev分支新增一行
[root@Git01 mycode]# git checkout master
切换到分支 'master'
您的分支与上游分支 'test/master' 一致。


[root@Git01 mycode]# git checkout master
切换到分支 'master'
您的分支与上游分支 'test/master' 一致。
[root@Git01 mycode]# git branch
  dev
* master           #处于master分支
[root@Git01 mycode]# cat benet.txt 
www
www
www
#将分支dev的变更合并到当前分支
[root@Git01 mycode]# git merge dev
更新 98db11e..83bc53d
Fast-forward
 benet.txt | 1 +
 1 file changed, 1 insertion(+)

[root@Git01 mycode]# cat benet.txt 
www
www
www
dev分支新增一行

3.3.2 Delete local branch

#将dev分支删除(当前不能在dev分支上)
[root@Git01 mycode]# git branch
  dev
* master
[root@Git01 mycode]# git branch -d dev
已删除分支 dev(曾为 83bc53d)。
[root@Git01 mycode]# git branch
* master
#假如dev分支的变更没有合并到当前分支,那么必须用-D参数强制删除分支
[root@Git01 mycode]# git branch
  dev
* master
[root@Git01 mycode]# git branch -d dev
error: 分支 'dev' 没有完全合并。
如果您确认要删除它,执行 'git branch -D dev'。
[root@Git01 mycode]# git branch -D dev
已删除分支 dev(曾为 83bc53d)。

3.3.3 manually merge local branch ===> Local branch code conflict resolution

  • When the directory of the same name between the local branch - the same name as the file - the content is not the same line at the same time, a collision occurs during branching and merging, so the code in order to solve the conflict, you need to manually merge;
  • At work, in order to avoid conflict between the general developer is not responsible for the same functionality as the module, it will not modify the same file at the same time.
#在Git01上进行操作,让dev分支和master分支产生文件代码冲突
[root@Git01 mycode]# git branch
* dev
  master
[root@Git01 mycode]# cat benet.txt 
www
www
www
dev        #本地dev分支benet.txt文件的第四行是dev
[root@Git01 mycode]# git status      #查看文件状态,已经提交暂存区无内容
位于分支 dev
nothing to commit, working tree clean
#切换到master分支
[root@Git01 mycode]# git checkout master
切换到分支 'master'
您的分支与上游分支 'test/master' 一致。
[root@Git01 mycode]# cat benet.txt 
www
www
www
master     本地master分支benet.txt文件的第四行是master
[root@Git01 mycode]# git status
位于分支 master
您的分支与上游分支 'test/master' 一致。
nothing to commit, working tree clean

Description: From the above, a local branch benet.txt dev conflicting files and fourth local line benet.txt master file branch. If at this time, we will change the local dev branches merged into the local master branch, then the code will produce conflict.

#合并本地dev分支
[root@Git01 mycode]# git branch
  dev
* master
[root@Git01 mycode]# git merge dev
自动合并 benet.txt
冲突(内容):合并冲突于 benet.txt    #报错说明,冲突在benet.txt文件
自动合并失败,修正冲突然后提交修正的结果。


#找出文件冲突内容,并修改。(此时冲突的benet.txt文件里已经被标注了冲突内容)
[root@Git01 mycode]# cat benet.txt 
www
www
www
<<<<<<< HEAD                #HEAD:表示当前所在的分支
master                      #此行表示当前所在分支本行的master和下边的linux所在分支的linux冲突
=======                     #隔离符号
dev                         #和上边的master内容冲突
>>>>>>> dev                 #dev分支
#到了这里我们只能手动排除,选择保留后的内容,假如我们要保留dev分支的内容,然后再将工作目录中的变更提交即可人工解决代码冲突,并完成分支合并
[root@Git01 mycode]# vim benet.txt 
[root@Git01 mycode]# cat benet.txt 
www
www
www
dev

[root@Git01 mycode]# git add *
[root@Git01 mycode]# git commit -m "修改了一个分支冲突"
[master 001ef0b] 修改了一个分支冲突

[root@Git01 mycode]# git status
位于分支 master
您的分支领先 'test/master' 共 1 个提交。
  (使用 "git push" 来发布您的本地提交)
nothing to commit, working tree clean

3.4 GIT remote branch management

3.4.1 linux local branch codes and labels push github remote repository branch dev

#在Git01上,创建本地分支dev,复制master分支代码。
[root@Git01 mycode]# git branch
* master
[root@Git01 mycode]# git status
位于分支 master
您的分支与上游分支 'test/master' 一致。
nothing to commit, working tree clean


#创建本地dev分支
[root@Git01 mycode]# git branch dev
[root@Git01 mycode]# git checkout dev
切换到分支 'dev'
[root@Git01 mycode]# git branch
* dev
  master
#将工作目录代码的benet.txt文件修改后提交到本地dev分支
[root@Git01 mycode]# cat benet.txt 
www
www
www
[root@Git01 mycode]# echo "远程分支提交测试" >> benet.txt
[root@Git01 mycode]# cat benet.txt 
www
www
www
远程分支提交测试

[root@Git01 mycode]# git add *
[root@Git01 mycode]# git commit -m "远程分支提交测试"
[dev c79df9c] 远程分支提交测试
 1 file changed, 1 insertion(+)

[root@Git01 mycode]# git status
位于分支 dev
nothing to commit, working tree clean
#将本地dev分支推送到远程github的dev分支
[root@Git01 mycode]# git push test dev
Username for 'https://github.com': [email protected]
Password for 'https://[email protected]@github.com': ywb971108
对象计数中: 3, 完成.
写入对象中: 100% (3/3), 306 bytes | 0 bytes/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
remote: 
remote: Create a pull request for 'dev' on GitHub by visiting:
remote:      https://github.com/ywb1108/yunwei/pull/new/dev
remote: 
To https://github.com/ywb1108/yunwei.git
 * [new branch]      dev -> dev

Browser Access: https: //github.com

image.png-89.6kB

image.png-53.6kB

#创建本地标签,并推送到github
[root@Git01 mycode]# git tag v1.0 -m "这就是一个测试"
[root@Git01 mycode]# git tag
v1.0

[root@Git01 mycode]# git push test v1.0
Username for 'https://github.com': [email protected]
Password for 'https://[email protected]@github.com': 
对象计数中: 1, 完成.
写入对象中: 100% (1/1), 185 bytes | 0 bytes/s, 完成.
Total 1 (delta 0), reused 0 (delta 0)
To https://github.com/ywb1108/yunwei.git
 * [new tag]         v1.0 -> v1.0

Browser Access: https: //github.com

image.png-67.4kB

3.4.2 branched from a remote repository github dev cloned into a local branch dev

(1) Cloning of a remote repository master branch, by switching to the remote dev branch checkout

#在Git02上进行操作
[root@Git02 /]# mkdir mycode2
[root@Git02 /]# cd mycode2/
[root@Git02 mycode2]# git init
初始化空的 Git 仓库于 /mycode2/.git/

#克隆远程仓库到本地
[root@Git02 mycode2]# git clone https://github.com/ywb1108/yunwei.git
正克隆到 'yunwei'...
remote: Enumerating objects: 20, done.
remote: Counting objects: 100% (20/20), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 20 (delta 1), reused 19 (delta 0), pack-reused 0
展开对象中: 100% (20/20), 完成.
检查连接... 完成。

[root@Git02 mycode2]# ls
yunwei
[root@Git02 mycode2]# cd yunwei/
[root@Git02 yunwei]# ls
benet.txt
[root@Git02 yunwei]# cat benet.txt    #不是之前上传的dev分支版本
www
www
www

[root@Git02 yunwei]# git branch
* master          #克隆下来的是master分支

说明:如果clone时不用-b dev指定分支进行克隆那么默认克隆的都是master分支;我们可以通过checkout切换远程分支的方式对于已经下载下来的master工作目录进行代码替换。

#查看github远程仓库分支情况
[root@Git02 yunwei]# git branch -a
* master
  remotes/origin/HEAD -> origin/master    #当前分支为origin/master分支
  remotes/origin/dev
  remotes/origin/master


#检查origin/dev远程分支
[root@Git02 yunwei]# git checkout origin/dev
Note: checking out 'origin/dev'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD 目前位于 c79df9c... 远程分支提交测试
[root@Git02 yunwei]# cat benet.txt 
www
www
www
远程分支提交测试     #文件内容已经变了
[root@Git02 yunwei]# git branch
* (头指针分离于 origin/dev)              #当前分支是origin/dev分支
  master
[root@Git02 yunwei]# git branch dev      #创建本地dev分支
[root@Git02 yunwei]# git branch
* (头指针分离于 origin/dev)
  dev
  master
[root@Git02 yunwei]# git checkout dev    #切换到本地dev分支
切换到分支 'dev'
[root@Git02 yunwei]# git branch
* dev
  master        #当前工作目录代码已经作为本地dev分支代码

(2)通过git clone -b linux URL直接指定远程仓库分支进行克隆

#克隆一个远程分支dev到本地工作目录(-b dev指定分支)
[root@Git02 mycode2]# git clone -b dev https://github.com/ywb1108/yunwei.git
正克隆到 'yunwei'...
remote: Enumerating objects: 20, done.
remote: Counting objects: 100% (20/20), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 20 (delta 1), reused 19 (delta 0), pack-reused 0
展开对象中: 100% (20/20), 完成.
检查连接... 完成。

[root@Git02 mycode2]# cat yunwei/benet.txt 
www
www
www
远程分支提交测试

4. GitLab服务器

前面我们已经知道Git人人都是中心,那他们怎么交互数据呢?

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

4.1 GitLab是什么?

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

4.2 为什么要使用GitLab?

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

4.3 GitLab安装

主机名 IP 备注 特殊要求
Git01 192.168.200.52 Git客户端
Git02 192.168.200.53 GitLab服务器 内存2G

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

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

#在Git02上安装GitLab
#初始环境
[root@Git02 ~]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@Git02 ~]# uname -r
3.10.0-862.el7.x86_64
[root@Git02 ~]# echo "Git02 127.0.0.1" >> /etc/hosts
[root@Git02 ~]# tail -1 /etc/hosts
Git02 127.0.0.1

[root@Git02 yuanmabao]# pwd
/root/yuanmabao
[root@Git02 yuanmabao]# tree
.
├── git-2.9.5.tar.gz
├── gitlab-11-2-stable-zh.tar.gz    #GitLab-11.2.3版汉化包
├── jdk-8u171-linux-x64.tar.gz
└── Python-3.5.2.tgz

0 directories, 4 files

[root@Git02 rpm]# pwd
/root/rpm
[root@Git02 rpm]# tree
.
└── gitlab-ce-11.2.3-ce.0.el7.x86_64.rpm  #GitLab-11.2.3版安装包

0 directories, 1 file
#下载GitLab最新版本安装包
[root@Git02 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.2.3-ce.0.el7.x86_64.rpm

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

重要说明:
yum localinstall 利用yum安装本地指定的rpm包,好处是自动解决依赖问题
#初始化GitLab,只需要执行一次
[root@Git02 ~]# gitlab-ctl reconfigure

#查看gitlab启动状态
[root@Git02 ~]# gitlab-ctl status
run: alertmanager: (pid 6379) 189s; run: log: (pid 6386) 189s
run: gitaly: (pid 6323) 200s; run: log: (pid 6332) 199s
run: gitlab-monitor: (pid 6347) 196s; run: log: (pid 6349) 195s
run: gitlab-workhorse: (pid 6307) 202s; run: log: (pid 6309) 202s
run: logrotate: (pid 4976) 922s; run: log: (pid 6315) 201s
run: nginx: (pid 4958) 927s; run: log: (pid 6314) 201s
run: node-exporter: (pid 5056) 909s; run: log: (pid 6337) 199s
run: postgres-exporter: (pid 6394) 188s; run: log: (pid 6399) 188s
run: postgresql: (pid 4692) 1032s; run: log: (pid 6291) 206s
run: prometheus: (pid 6359) 195s; run: log: (pid 6363) 194s
run: redis: (pid 4630) 1044s; run: log: (pid 6276) 213s
run: redis-exporter: (pid 5160) 898s; run: log: (pid 6350) 196s
run: sidekiq: (pid 4928) 941s; run: log: (pid 6295) 205s
run: unicorn: (pid 4891) 947s; run: log: (pid 6293) 206s

#查看GitLab版本号
[root@Git02 ~]# cat /opt/gitlab/embedded/service/gitlab-rails/VERSION 
11.2.3

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

image.png-49.8kB
接下来我们设定管理员初始密码,最少8位

image.png-51.8kB

image.png-44.5kB
登陆后,我们就可以选择如下功能使用了

image.png-67.4kB

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

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

#解压GitLab中文版补丁包
[root@Git02 ~]# tar xf gitlab-11-2-stable-zh.tar.gz 

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

#查看解压后的补丁包版本号
[root@Git02 ~]# cat gitlab-11-2-stable-zh/VERSION 
11.2.3

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

#将中文补丁包的内容覆盖英文版
[root@Git02 yuanmabao]# pwd
/root/yuanmabao
[root@Git02 ~]# /bin/cp -rf gitlab-11-2-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails/
/bin/cp: 无法以目录"gitlab-11-2-stable-zh/log" 来覆盖非目录"/opt/gitlab/embedded/service/gitlab-rails/log"
/bin/cp: 无法以目录"gitlab-11-2-stable-zh/tmp" 来覆盖非目录"/opt/gitlab/embedded/service/gitlab-rails/tmp"

说明:此报错不用管,因为已经设置过root密码,登陆过,所以会报错

#重新配置GitLab
[root@Git02 ~]# gitlab-ctl reconfigure

#重新启动GitLab
[root@Git02 ~]# gitlab-ctl restart

重新刷新浏览器访问GitLab http://192.168.200.53

image.png-67.4kB

4.5 使用GitLab

4.5.1 创建一个新项目

image.png-58kB

image.png-68.9kB

image.png-64kB

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

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

[root@Git02 ~]# cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.bak

[root@Git02 ~]# cat -n /etc/gitlab/gitlab.rb | sed -n '13p;943p'
    13  external_url 'http://192.168.200.53:8888'
   943  nginx['listen_port'] = 8888
   
#重新配置GitLab
[root@Git02 ~]# gitlab-ctl reconfigure

#重启动GitLab
[root@Git02 ~]# gitlab-ctl restart

重新访问浏览器http://192.168.200.53:8888
image.png-12.2kB

image.png-14.3kB

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

#在Git01客户端上
[root@Git01 mycode]# pwd
/mycode
[root@Git01 mycode]# git branch
  linux
* master        #当前在master分支

#添加远程GitLab仓库管理
[root@Git01 mycode]# git remote add origin http://192.168.200.53:8888/root/yunjisuan.git
[root@Git01 mycode]# git remote -v
origin  http://192.168.200.53:8888/root/yunjisuan.git (fetch)
origin  http://192.168.200.53:8888/root/yunjisuan.git (push)
test    https://github.com/ywb1108/yunwei.git (fetch)
test    https://github.com/ywb1108/yunwei.git (push)

#推送本地仓库master分支到远程仓库GitLab上
[root@Git01 mycode]# git push origin master
Username for 'http://192.168.200.53:8888': root
Password for 'http://[email protected]:8888': ywb971108
对象计数中: 16, 完成.
Delta compression using up to 2 threads.
压缩对象中: 100% (6/6), 完成.
写入对象中: 100% (16/16), 1.19 KiB | 0 bytes/s, 完成.
Total 16 (delta 1), reused 0 (delta 0)
To http://192.168.200.53:8888/root/yunjisuan.git
 * [new branch]      master -> master
 #推送本地仓库dev分支到远程仓库GitLab上
[root@Git01 mycode]# git branch
  dev
* master
[root@Git01 mycode]# git checkout dev
切换到分支 'dev'
[root@Git01 mycode]# git branch
* dev
  master

[root@Git01 mycode]# git push origin dev
Username for 'http://192.168.200.53:8888': root
Password for 'http://[email protected]: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
#推送本地仓库标签V1.0到远程仓库GitLab上
[root@Git01 mycode]# git tag
v1.0
[root@Git01 mycode]# git push origin v1.0
Username for 'http://192.168.200.53:8888': root
Password for 'http://[email protected]:8888': 
对象计数中: 1, 完成.
写入对象中: 100% (1/1), 185 bytes | 0 bytes/s, 完成.
Total 1 (delta 0), reused 0 (delta 0)
To http://192.168.200.53:8888/root/yunjisuan.git
 * [new tag]         v1.0 -> v1.0

image.png-98.8kB

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

#创建Git工作目录
[root@Git01 ~]# mkdir -p /GitLab
[root@Git01 ~]# cd /GitLab
[root@Git01 GitLab]# git init
初始化空的 Git 仓库于 /GitLab/.git/
#克隆远程仓库GitLab的Linux分支
[root@Git01 GitLab]# git clone -b dev http://192.168.200.53:8888/root/yunjisuan.git
正克隆到 'yunjisuan'...
Username for 'http://192.168.200.53:8888': root
Password for 'http://[email protected]:8888': 
remote: Enumerating objects: 20, done.
remote: Counting objects: 100% (20/20), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 20 (delta 1), reused 0 (delta 0)
展开对象中: 100% (20/20), 完成.
检查连接... 完成。
[root@Git01 GitLab]# ls
yunjisuan
[root@Git01 GitLab]# cd yunjisuan/
[root@Git01 yunjisuan]# ls
benet.txt
[root@Git01 yunjisuan]# cat benet.txt 
www
www
www
远程分支提交测试

[root@Git01 yunjisuan]# git branch
* dev

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

#在Git01客户端生成密钥对 
[root@Git01 ~]# ssh-keygen -t rsa -C '[email protected]'
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:m1F7R3PI9FTjaLU1nMtapqKwt0jOVeOjm//kL1i6bME [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|              o+*|
|             o+*=|
|          .  o*o+|
|         . ... B |
|        S oo. *  |
|       . +oE.=   |
|       .=..o*.   |
|      +.oo+++.   |
|       +.==+ooo. |
+----[SHA256]-----+
[root@Git01 ~]# cat /root/.ssh/id_rsa.pub     #公钥内容,复制到GitLab上
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDeaghn5xFg42nPFOFGUUfY4ehtObN50ifilaOuq9n0G/qowOAt2wrPrjmPbINNW1zaWC2h0O7JWz/WVUqhsX+n7GpMwSBeAZZAZinxjjyR5RZjI5DKq0nXr8olA7v75d97/wsSt3RFLek6/J8qyPJzIl0iRzDVYPZ9Duw2iczqoULkufgYuxmMKsxDPNddtBBWaELq4UiTRODIy0KIh1trYJRGSrowx+/gtVOJhqZlMP//iKFgG3EqzX8OrsSeWZptgAW235QUGOD4iQFHsy7jpnByvsJs+n+FqZXkHrajo41oCF+262MLyjx0Mol/SnDxMjrBZe3xssCUHiZHfNVv [email protected]

在浏览器端打开GitLab http://192.168.200.53:8888

image.png-40.6kB

image.png-108.8kB

image.png-26.1kB

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

[root@Git01 ~]# mkdir -p /test
[root@Git01 ~]# cd /test
[root@Git01 test]# git init
初始化空的 Git 仓库于 /test/.git/
#将远程GitLab的Linux分支克隆到本地
[root@Git01 test]# git clone -b dev [email protected]:root/yunjisuan.git
正克隆到 'yunjisuan'...
The authenticity of host '192.168.200.53 (192.168.200.53)' can't be established.
ECDSA key fingerprint is SHA256:YffccmTao7pfkcNGKqlEIhoCLAFpLhu2pQqzcXH9XzQ.
ECDSA key fingerprint is MD5:2b:fc:d4:4a:50:dd:3d:3e:f2:42:14:9a:57:12:2b:b8.
Are you sure you want to continue connecting (yes/no)? yes  #首次登录
Warning: Permanently added '192.168.200.53' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 20, done.
remote: Counting objects: 100% (20/20), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 20 (delta 1), reused 0 (delta 0)
接收对象中: 100% (20/20), 完成.
处理 delta 中: 100% (1/1), 完成.
检查连接... 完成。
[root@Git01 test]# ls
yunjisuan
[root@Git01 test]# cd yunjisuan/
[root@Git01 yunjisuan]# ls
benet.txt
[root@Git01 yunjisuan]# cat benet.txt 
www
www
www
远程分支提交测试
[root@Git01 yunjisuan]# git branch
* dev

4.6 配置GitLab邮件服务

配置邮箱服务的用途:

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

配置步骤:

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

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

[root@Git02 ~]# systemctl start postfix
[root@Git02 ~]# systemctl enable postfix
[root@Git02 ~]# systemctl status postfix
#以下省略。。。

image.png-64.2kB

image.png-47.1kB

image.png-32.2kB

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

[root@Git02 ~]# cat -n /etc/gitlab/gitlab.rb | sed -n '53p;472,480p;618p'
    53  gitlab_rails['gitlab_email_from'] = '[email protected]'         #GitLab默认邮箱
   472  gitlab_rails['smtp_enable'] = true               #开启功能
   473  gitlab_rails['smtp_address'] = "smtp.qq.com"     #QQ的smtp服务
   474  gitlab_rails['smtp_port'] = 465
   475  gitlab_rails['smtp_user_name'] = "[email protected]"            #smtp用户邮箱
   476  gitlab_rails['smtp_password'] = "gxdnyozoimckgdfe"  #开通QQsmtp时返回的字符串
   477  gitlab_rails['smtp_domain'] = "qq.com"           #smtp域名
   478  gitlab_rails['smtp_authentication'] = "login"
   479  gitlab_rails['smtp_enable_starttls_auto'] = true
   480  gitlab_rails['smtp_tls'] = true
   618  user['git_user_email'] = "[email protected]"     #git用户邮箱
#重新加载GitLab配置文件
[root@Git02 ~]# gitlab-ctl reconfigure

#重启动GitLab服务
[root@Git02 ~]# gitlab-ctl restart

#进入GitLab控制台进行邮件发送测试
[root@Git02 ~]# gitlab-rails console    #开启GitLab控制台
-------------------------------------------------------------------------------------
 GitLab:       11.2.3 (06cbee3)
 GitLab Shell: 8.1.1
 postgresql:   9.6.8
-------------------------------------------------------------------------------------
Loading production environment (Rails 4.2.10)
irb(main):001:0> Notify.test_email('[email protected]','this is title','hello,杨哥!').deliver_now
#以下省略。。。

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

image.png-12.4kB

4.7 GitLab的账号注册及分组

4.7.1 账户注册测试

image.png-49.5kB

image.png-65.8kB

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

4.7.2 开启GitLab邮箱验证功能

重新登陆管理员用户root,密码:ywb971108 ,我们进行如下操作

image.png-73.6kB
退出时别忘了保存修改的设置如下图

image.png-1.8kB
然后我们退出管理员的登陆,重新进行重新注册

image.png-50.7kB

image.png-16.8kB

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

image.png-11.1kB

image.png-31.7kB

image.png-45.8kB

image.png-63.1kB

4.7.3 创建一个项目组

image.png-65.3kB

image.png-71.5kB

4.7.4 给组添加成员并授权

image.png-7kB

image.png-77.2kB

image.png-4.1kB

  • Guest访客: 只能发表评论,不能读写项目库
  • Reporter报告者: 只能克隆代码(读),不能提交代码(修改)(产品测试)
  • Developer Developer: code can be read (normal programmer)
  • Master master programmer: You can add project members, add tags, create and protect the branch (Product Manager)
  • Owner Owner: has all privileges (generally do not have this privilege)

image.png-47.8kB
After adding permissions success, GitLab will automatically notify the user a message

image.png-24.3kB

4.7.5 Creating a new project to the project team

image.png-31.1kB

image.png-46.9kB

image.png-51.6kB

4.7.5 carry out the project team members to submit and cloning test

#进行组成员代码提交测试
[root@Git01 /]# mkdir benet
[root@Git01 /]# cd benet/
[root@Git01 benet]# git init
初始化空的 Git 仓库于 /benet/.git/
#进行克隆测试
[root@Git01 benet]# git clone http://192.168.200.53:8888/test/benet.git
正克隆到 'benet'...
Username for 'http://192.168.200.53:8888': [email protected]
Password for 'http://[email protected]@192.168.200.53:8888': xiaolinlin
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
展开对象中: 100% (3/3), 完成.
检查连接... 完成。

[root@Git01 benet]# ls
benet
[root@Git01 benet]# cd benet/
[root@Git01 benet]# ls
README.md
[root@Git01 benet]# cat README.md 
# benet
#推送代码到远程GitLab
[root@Git01 benet]# echo "welcome to yunjisuan" >> README.md
[root@Git01 benet]# cat README.md 
# benet

welcome to yunjisuan
[root@Git01 benet]# git add *
[root@Git01 benet]# git commit -m "提交測試"
[master 3055139] 提交測試
 1 file changed, 1 insertion(+)

[root@Git01 benet]# git remote -v
origin  http://192.168.200.53:8888/test/benet.git (fetch)
origin  http://192.168.200.53:8888/test/benet.git (push)


[root@Git01 benet]# git push http://192.168.200.53:8888/test/benet.git
Username for 'http://192.168.200.53:8888': [email protected]
Password for 'http://[email protected]@192.168.200.53:8888': xiaolinlin
对象计数中: 3, 完成.
写入对象中: 100% (3/3), 285 bytes | 0 bytes/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
To http://192.168.200.53:8888/test/benet.git
   0b723ba..3055139  master -> master

image.png-19.1kB

Guess you like

Origin www.cnblogs.com/ywb123/p/11227953.html