[关闭]
@yangwenbo 2021-03-14T21:53:46.000000Z 字数 21651 阅读 362

Git

Git分布式版本控制系统(下)

3. GIT分支管理

3.1 分支的结构概述

在实际的项目开发中,尽量保证master分支稳定,仅用于发布新版本,平时不要随便直接修改里面的数据文件。
那在哪干活呢?干活都在dev分支上。每个人从dev分支创建自己个人分支,开发完合并到dev分支,最后dev分支合并到master分支。
所以,团队的合作分支看起来会像下图那样。

image.png-88.8kB

  • 分支管理工作流程:
    • 在工作中,为了保证master分支稳定,产品经理通常会从master分支上复制一份代码作为dev分支;
    • 然后成员开发A在从dev分支上复制一份代码叫做michael;
    • 然后成员开发B再从dev分支上复制一份代码叫做bob;
    • 平时开发A和开发B推送和拉取代码都在自己的个人分支michael和bob上。
    • 当一个新功能开发完毕,或者一个bug修改完毕以后。开发人员会先将代码变更推送到自己的个人分支,然后再把个人分支的变更合并到dev分支里;
    • 当开发经理和测试人员拉取dev分支的代码进行测试以后,如果没问题,那么开发经理会把dev分支的变更合并进master版本;
    • 最后,由于master版本新增了测试过的新功能,那么就需要进行项目发布或者代码上线了。

3.2 GIT本地分支管理

3.2.1 本地分支的创建与切换
  • git branch : 查看当前分支情况,当前分支前有*号
  • git branch dev : 创建分支
  • git checkout: 检查本地分支与远程分支的变更差异
  • git checkout dev:切换分支
  1. #检查当前分支情况
  2. [root@Git01 mycode]# pwd
  3. /mycode
  4. [root@Git01 mycode]# git branch
  5. * master #当前所处分支
  6. [root@Git01 mycode]# git branch dev #创建dev分支
  7. [root@Git01 mycode]# git branch
  8. dev
  9. * master #当前所处分支
  10. [root@Git01 mycode]# git checkout dev #切换到dev分支
  11. 切换到分支 'dev'
  12. [root@Git01 mycode]# git branch
  13. * dev #当前所处分支
  14. master
3.2.2 尝试在linux本地分支进行代码提交
  1. [root@Git01 mycode]# git branch
  2. * dev
  3. master
  4. [root@Git01 mycode]# cat benet.txt
  5. www
  6. www
  7. www
  8. [root@Git01 mycode]# echo "dev分支新增一行" >> benet.txt
  9. [root@Git01 mycode]# cat benet.txt
  10. www
  11. www
  12. www
  13. dev分支新增一行
  14. [root@Git01 mycode]# git add *
  15. [root@Git01 mycode]# git status
  16. 位于分支 dev
  17. 要提交的变更:
  18. (使用 "git reset HEAD <文件>..." 以取消暂存)
  19. 修改: benet.txt
  1. #此时我们先将改变提交到本地dev分支以后在切换分支
  2. #将变更提交到本地dev分支
  3. [root@Git01 mycode]# git branch
  4. * dev
  5. master
  6. [root@Git01 mycode]# git commit -m "dev第一次提交"
  7. [dev 083024b] dev第一次提交
  8. 1 file changed, 4 insertions(+)
  9. [root@Git01 mycode]# cat benet.txt
  10. www
  11. www
  12. www
  13. dev分支新增一行 #dev分支比master分支新增一行数据
  14. [root@Git01 mycode]# git checkout master
  15. 切换到分支 'master'
  16. 您的分支与上游分支 'test/master' 一致。
  17. [root@Git01 mycode]# git branch
  18. dev
  19. * master
  20. [root@Git01 mycode]# cat benet.txt
  21. www
  22. www
  23. www

说明:

  • 我们发现切换分支以后,在linux分支修改过的文件数据,完全还原成了master分支的文件内容
  • 但是这里存在一个问题,假如我们在linux分支下,修改了文件,但是并未提交到本地仓库linux分支,而只是放到了暂存区就切换到master分支的话,那么会发生什么呢?
  1. #切换到dev分支
  2. [root@Git01 mycode]# git checkout dev
  3. 切换到分支 'dev'
  4. [root@Git01 mycode]# git branch
  5. * dev
  6. master
  7. [root@Git01 mycode]# cat benet.txt
  8. www
  9. www
  10. www
  11. dev分支新增一行
  12. #再次新增一行数据
  13. [root@Git01 mycode]# echo "dev分支新增第二行" >> benet.txt
  14. [root@Git01 mycode]# cat benet.txt
  15. www
  16. www
  17. www
  18. dev分支新增一行
  19. dev分支新增第二行
  20. #文件变更添加到暂存区
  21. [root@Git01 mycode]# git add *
  22. [root@Git01 mycode]# git status
  23. 位于分支 dev
  24. 要提交的变更:
  25. (使用 "git reset HEAD <文件>..." 以取消暂存)
  26. 修改: benet.txt
  1. #切换分支master,但由于没有提交暂存区的改变,因此切换分支失败
  2. [root@Git01 mycode]# git checkout master
  3. error: Your local changes to the following files would be overwritten by checkout:
  4. benet.txt
  5. Please commit your changes or stash them before you switch branches.
  6. 终止中
  7. [root@Git01 mycode]# git branch
  8. * dev #依旧在dev分支
  9. master

说明:

  • 当linux的本地分支仓库和master本地分支仓库的代码不同时,如果你没把变更从暂存区提交到分支仓库,那么默认是不能切换分支的。
  • 但是,这里还有一个问题,假如linux分支和master分支的本地仓库的代码相同,但是我仍旧没把linux分支的变更提交到本地linux分支仓库,那么能直接切换master分支吗?
  1. #将本地分支master和dev的代码保存为一致。
  2. [root@Git01 mycode]# git branch
  3. dev
  4. * master
  5. [root@Git01 mycode]# cat benet.txt
  6. www
  7. www
  8. www
  9. [root@Git01 mycode]# git checkout dev
  10. 切换到分支 'dev'
  11. [root@Git01 mycode]# git branch
  12. * dev
  13. master
  14. [root@Git01 mycode]# cat benet.txt
  15. www
  16. www
  17. www
  1. #在linux分支修改benet.txt文件
  2. [root@Git01 mycode]# git branch
  3. * dev #当前在dev分支
  4. master
  5. [root@Git01 mycode]# echo "dev第一次修改" >> benet.txt
  6. [root@Git01 mycode]# cat benet.txt
  7. www
  8. www
  9. www
  10. dev第一次修改
  11. [root@Git01 mycode]# git add *
  12. [root@Git01 mycode]# git status
  13. 位于分支 dev
  14. 要提交的变更:
  15. (使用 "git reset HEAD <文件>..." 以取消暂存)
  16. 修改: benet.txt
  1. #切换到master分支
  2. [root@Git01 mycode]# git checkout master
  3. M benet.txt
  4. 切换到分支 'master'
  5. 您的分支与上游分支 'test/master' 一致。
  6. [root@Git01 mycode]# git branch
  7. dev
  8. * master #当前在master分支
  9. [root@Git01 mycode]# cat benet.txt
  10. www
  11. www
  12. www
  13. dev第一次修改 #之前的修改仍旧存在
  14. [root@Git01 mycode]# git status #切换分支前的暂存区内容还在
  15. 位于分支 master
  16. 您的分支与上游分支 'test/master' 一致。
  17. 要提交的变更:
  18. (使用 "git reset HEAD <文件>..." 以取消暂存)
  19. 修改: benet.txt

说明:

  • 如果本地分支仓库间的代码一致,那么就算不把变更提交到本地分支仓库,那么也可以切换分支,这点要注意。
  • 在工作中,为了避免意外,在切换分支前,务必要先将暂存区提交或者清空。
  1. #清空暂存区内容
  2. [root@Git01 mycode]# git status
  3. 位于分支 master
  4. 您的分支与上游分支 'test/master' 一致。
  5. 要提交的变更:
  6. (使用 "git reset HEAD <文件>..." 以取消暂存)
  7. 修改: benet.txt
  8. [root@Git01 mycode]# git reset #清空暂存区内容
  9. 重置后取消暂存的变更:
  10. M benet.txt
  11. [root@Git01 mycode]# git status
  12. 位于分支 master
  13. 您的分支与上游分支 'test/master' 一致。
  14. 尚未暂存以备提交的变更:
  15. (使用 "git add <文件>..." 更新要提交的内容)
  16. (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
  17. 修改: benet.txt
  18. 修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

3.3 本地分支的合并与删除

  • 想把linux的工作成果合并到master分支上;
  • 先切换到master分支
  • git merge dev : 合并dev分支到master
  • git branch -d dev :确定合并完成后,可以放心的删除dev分支。
3.3.1 自动合并本地分支
  1. [root@Git01 mycode]# git branch
  2. * dev #处于dev分支
  3. master
  4. [root@Git01 mycode]# cat benet.txt
  5. www
  6. www
  7. www
  8. dev分支新增一行
  9. [root@Git01 mycode]# git checkout master
  10. 切换到分支 'master'
  11. 您的分支与上游分支 'test/master' 一致。
  12. [root@Git01 mycode]# git checkout master
  13. 切换到分支 'master'
  14. 您的分支与上游分支 'test/master' 一致。
  15. [root@Git01 mycode]# git branch
  16. dev
  17. * master #处于master分支
  18. [root@Git01 mycode]# cat benet.txt
  19. www
  20. www
  21. www
  1. #将分支dev的变更合并到当前分支
  2. [root@Git01 mycode]# git merge dev
  3. 更新 98db11e..83bc53d
  4. Fast-forward
  5. benet.txt | 1 +
  6. 1 file changed, 1 insertion(+)
  7. [root@Git01 mycode]# cat benet.txt
  8. www
  9. www
  10. www
  11. dev分支新增一行
3.3.2 本地分支的删除
  1. #将dev分支删除(当前不能在dev分支上)
  2. [root@Git01 mycode]# git branch
  3. dev
  4. * master
  5. [root@Git01 mycode]# git branch -d dev
  6. 已删除分支 dev(曾为 83bc53d)。
  7. [root@Git01 mycode]# git branch
  8. * master
  1. #假如dev分支的变更没有合并到当前分支,那么必须用-D参数强制删除分支
  2. [root@Git01 mycode]# git branch
  3. dev
  4. * master
  5. [root@Git01 mycode]# git branch -d dev
  6. error: 分支 'dev' 没有完全合并。
  7. 如果您确认要删除它,执行 'git branch -D dev'
  8. [root@Git01 mycode]# git branch -D dev
  9. 已删除分支 dev(曾为 83bc53d)。
3.3.3 手动合并本地分支===>本地分支代码冲突解决方案
  • 当本地分支之间的同名目录-同名文件-同一行内容不同时,在进行分支合并时就会产生冲突,故为了解决代码冲突,就需要进行人工手动合并;
  • 在工作中,为了尽量避免冲突,一般开发人员之间尽可能不负责相同的功能模块,也就不至于同时修改同一个文件。
  1. #在Git01上进行操作,让dev分支和master分支产生文件代码冲突
  2. [root@Git01 mycode]# git branch
  3. * dev
  4. master
  5. [root@Git01 mycode]# cat benet.txt
  6. www
  7. www
  8. www
  9. dev #本地dev分支benet.txt文件的第四行是dev
  10. [root@Git01 mycode]# git status #查看文件状态,已经提交暂存区无内容
  11. 位于分支 dev
  12. nothing to commit, working tree clean
  1. #切换到master分支
  2. [root@Git01 mycode]# git checkout master
  3. 切换到分支 'master'
  4. 您的分支与上游分支 'test/master' 一致。
  5. [root@Git01 mycode]# cat benet.txt
  6. www
  7. www
  8. www
  9. master 本地master分支benet.txt文件的第四行是master
  10. [root@Git01 mycode]# git status
  11. 位于分支 master
  12. 您的分支与上游分支 'test/master' 一致。
  13. nothing to commit, working tree clean

说明:
由上可知,本地dev分支的benet.txt文件和本地master分支的benet.txt文件的第四行代码产生冲突。如果此时,我们将本地dev分支的变更合并到本地master分支中,那么就会产生代码冲突。

  1. #合并本地dev分支
  2. [root@Git01 mycode]# git branch
  3. dev
  4. * master
  5. [root@Git01 mycode]# git merge dev
  6. 自动合并 benet.txt
  7. 冲突(内容):合并冲突于 benet.txt #报错说明,冲突在benet.txt文件
  8. 自动合并失败,修正冲突然后提交修正的结果。
  9. #找出文件冲突内容,并修改。(此时冲突的benet.txt文件里已经被标注了冲突内容)
  10. [root@Git01 mycode]# cat benet.txt
  11. www
  12. www
  13. www
  14. <<<<<<< HEAD #HEAD:表示当前所在的分支
  15. master #此行表示当前所在分支本行的master和下边的linux所在分支的linux冲突
  16. ======= #隔离符号
  17. dev #和上边的master内容冲突
  18. >>>>>>> dev #dev分支
  1. #到了这里我们只能手动排除,选择保留后的内容,假如我们要保留dev分支的内容,然后再将工作目录中的变更提交即可人工解决代码冲突,并完成分支合并
  2. [root@Git01 mycode]# vim benet.txt
  3. [root@Git01 mycode]# cat benet.txt
  4. www
  5. www
  6. www
  7. dev
  8. [root@Git01 mycode]# git add *
  9. [root@Git01 mycode]# git commit -m "修改了一个分支冲突"
  10. [master 001ef0b] 修改了一个分支冲突
  11. [root@Git01 mycode]# git status
  12. 位于分支 master
  13. 您的分支领先 'test/master' 1 个提交。
  14. (使用 "git push" 来发布您的本地提交)
  15. nothing to commit, working tree clean

3.4 GIT远程分支管理

3.4.1 将linux本地分支代码和标签推送到github远程仓库的dev分支
  1. #在Git01上,创建本地分支dev,复制master分支代码。
  2. [root@Git01 mycode]# git branch
  3. * master
  4. [root@Git01 mycode]# git status
  5. 位于分支 master
  6. 您的分支与上游分支 'test/master' 一致。
  7. nothing to commit, working tree clean
  8. #创建本地dev分支
  9. [root@Git01 mycode]# git branch dev
  10. [root@Git01 mycode]# git checkout dev
  11. 切换到分支 'dev'
  12. [root@Git01 mycode]# git branch
  13. * dev
  14. master
  1. #将工作目录代码的benet.txt文件修改后提交到本地dev分支
  2. [root@Git01 mycode]# cat benet.txt
  3. www
  4. www
  5. www
  6. [root@Git01 mycode]# echo "远程分支提交测试" >> benet.txt
  7. [root@Git01 mycode]# cat benet.txt
  8. www
  9. www
  10. www
  11. 远程分支提交测试
  12. [root@Git01 mycode]# git add *
  13. [root@Git01 mycode]# git commit -m "远程分支提交测试"
  14. [dev c79df9c] 远程分支提交测试
  15. 1 file changed, 1 insertion(+)
  16. [root@Git01 mycode]# git status
  17. 位于分支 dev
  18. nothing to commit, working tree clean
  1. #将本地dev分支推送到远程github的dev分支
  2. [root@Git01 mycode]# git push test dev
  3. Username for 'https://github.com': 1773464408@qq.com
  4. Password for 'https://1773464408@qq.com@github.com': ywb971108
  5. 对象计数中: 3, 完成.
  6. 写入对象中: 100% (3/3), 306 bytes | 0 bytes/s, 完成.
  7. Total 3 (delta 0), reused 0 (delta 0)
  8. remote:
  9. remote: Create a pull request for 'dev' on GitHub by visiting:
  10. remote: https://github.com/ywb1108/yunwei/pull/new/dev
  11. remote:
  12. To https://github.com/ywb1108/yunwei.git
  13. * [new branch] dev -> dev

浏览器访问:https://github.com

image.png-89.6kB

image.png-53.6kB

  1. #创建本地标签,并推送到github
  2. [root@Git01 mycode]# git tag v1.0 -m "这就是一个测试"
  3. [root@Git01 mycode]# git tag
  4. v1.0
  5. [root@Git01 mycode]# git push test v1.0
  6. Username for 'https://github.com': 1773464408@qq.com
  7. Password for 'https://1773464408@qq.com@github.com':
  8. 对象计数中: 1, 完成.
  9. 写入对象中: 100% (1/1), 185 bytes | 0 bytes/s, 完成.
  10. Total 1 (delta 0), reused 0 (delta 0)
  11. To https://github.com/ywb1108/yunwei.git
  12. * [new tag] v1.0 -> v1.0

浏览器访问:https://github.com

image.png-67.4kB

3.4.2 从github远程仓库克隆一个dev分支到本地dev分支

(1)克隆远程仓库master分支后,通过checkout切换成远程dev分支

  1. #在Git02上进行操作
  2. [root@Git02 /]# mkdir mycode2
  3. [root@Git02 /]# cd mycode2/
  4. [root@Git02 mycode2]# git init
  5. 初始化空的 Git 仓库于 /mycode2/.git/
  6. #克隆远程仓库到本地
  7. [root@Git02 mycode2]# git clone https://github.com/ywb1108/yunwei.git
  8. 正克隆到 'yunwei'...
  9. remote: Enumerating objects: 20, done.
  10. remote: Counting objects: 100% (20/20), done.
  11. remote: Compressing objects: 100% (8/8), done.
  12. remote: Total 20 (delta 1), reused 19 (delta 0), pack-reused 0
  13. 展开对象中: 100% (20/20), 完成.
  14. 检查连接... 完成。
  15. [root@Git02 mycode2]# ls
  16. yunwei
  17. [root@Git02 mycode2]# cd yunwei/
  18. [root@Git02 yunwei]# ls
  19. benet.txt
  20. [root@Git02 yunwei]# cat benet.txt #不是之前上传的dev分支版本
  21. www
  22. www
  23. www
  24. [root@Git02 yunwei]# git branch
  25. * master #克隆下来的是master分支

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

  1. #查看github远程仓库分支情况
  2. [root@Git02 yunwei]# git branch -a
  3. * master
  4. remotes/origin/HEAD -> origin/master #当前分支为origin/master分支
  5. remotes/origin/dev
  6. remotes/origin/master
  7. #检查origin/dev远程分支
  8. [root@Git02 yunwei]# git checkout origin/dev
  9. Note: checking out 'origin/dev'.
  10. You are in 'detached HEAD' state. You can look around, make experimental
  11. changes and commit them, and you can discard any commits you make in this
  12. state without impacting any branches by performing another checkout.
  13. If you want to create a new branch to retain commits you create, you may
  14. do so (now or later) by using -b with the checkout command again. Example:
  15. git checkout -b <new-branch-name>
  16. HEAD 目前位于 c79df9c... 远程分支提交测试
  17. [root@Git02 yunwei]# cat benet.txt
  18. www
  19. www
  20. www
  21. 远程分支提交测试 #文件内容已经变了
  1. [root@Git02 yunwei]# git branch
  2. * (头指针分离于 origin/dev #当前分支是origin/dev分支
  3. master
  4. [root@Git02 yunwei]# git branch dev #创建本地dev分支
  5. [root@Git02 yunwei]# git branch
  6. * (头指针分离于 origin/dev
  7. dev
  8. master
  9. [root@Git02 yunwei]# git checkout dev #切换到本地dev分支
  10. 切换到分支 'dev'
  11. [root@Git02 yunwei]# git branch
  12. * dev
  13. master #当前工作目录代码已经作为本地dev分支代码

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

  1. #克隆一个远程分支dev到本地工作目录(-b dev指定分支)
  2. [root@Git02 mycode2]# git clone -b dev https://github.com/ywb1108/yunwei.git
  3. 正克隆到 'yunwei'...
  4. remote: Enumerating objects: 20, done.
  5. remote: Counting objects: 100% (20/20), done.
  6. remote: Compressing objects: 100% (8/8), done.
  7. remote: Total 20 (delta 1), reused 19 (delta 0), pack-reused 0
  8. 展开对象中: 100% (20/20), 完成.
  9. 检查连接... 完成。
  10. [root@Git02 mycode2]# cat yunwei/benet.txt
  11. www
  12. www
  13. www
  14. 远程分支提交测试

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/

  1. #在Git02上安装GitLab
  2. #初始环境
  3. [root@Git02 ~]# cat /etc/redhat-release
  4. CentOS Linux release 7.5.1804 (Core)
  5. [root@Git02 ~]# uname -r
  6. 3.10.0-862.el7.x86_64
  7. [root@Git02 ~]# echo "Git02 127.0.0.1" >> /etc/hosts
  8. [root@Git02 ~]# tail -1 /etc/hosts
  9. Git02 127.0.0.1
  10. [root@Git02 yuanmabao]# pwd
  11. /root/yuanmabao
  12. [root@Git02 yuanmabao]# tree
  13. .
  14. ├── git-2.9.5.tar.gz
  15. ├── gitlab-11-2-stable-zh.tar.gz #GitLab-11.2.3版汉化包
  16. ├── jdk-8u171-linux-x64.tar.gz
  17. └── Python-3.5.2.tgz
  18. 0 directories, 4 files
  19. [root@Git02 rpm]# pwd
  20. /root/rpm
  21. [root@Git02 rpm]# tree
  22. .
  23. └── gitlab-ce-11.2.3-ce.0.el7.x86_64.rpm #GitLab-11.2.3版安装包
  24. 0 directories, 1 file
  1. #下载GitLab最新版本安装包
  2. [root@Git02 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.2.3-ce.0.el7.x86_64.rpm
  3. [root@Git02 ~]# yum localinstall gitlab-ce-11.2.3-ce.0.el7.x86_64.rpm -y
  4. 重要说明:
  5. yum localinstall 利用yum安装本地指定的rpm包,好处是自动解决依赖问题
  1. #初始化GitLab,只需要执行一次
  2. [root@Git02 ~]# gitlab-ctl reconfigure
  3. #查看gitlab启动状态
  4. [root@Git02 ~]# gitlab-ctl status
  5. run: alertmanager: (pid 6379) 189s; run: log: (pid 6386) 189s
  6. run: gitaly: (pid 6323) 200s; run: log: (pid 6332) 199s
  7. run: gitlab-monitor: (pid 6347) 196s; run: log: (pid 6349) 195s
  8. run: gitlab-workhorse: (pid 6307) 202s; run: log: (pid 6309) 202s
  9. run: logrotate: (pid 4976) 922s; run: log: (pid 6315) 201s
  10. run: nginx: (pid 4958) 927s; run: log: (pid 6314) 201s
  11. run: node-exporter: (pid 5056) 909s; run: log: (pid 6337) 199s
  12. run: postgres-exporter: (pid 6394) 188s; run: log: (pid 6399) 188s
  13. run: postgresql: (pid 4692) 1032s; run: log: (pid 6291) 206s
  14. run: prometheus: (pid 6359) 195s; run: log: (pid 6363) 194s
  15. run: redis: (pid 4630) 1044s; run: log: (pid 6276) 213s
  16. run: redis-exporter: (pid 5160) 898s; run: log: (pid 6350) 196s
  17. run: sidekiq: (pid 4928) 941s; run: log: (pid 6295) 205s
  18. run: unicorn: (pid 4891) 947s; run: log: (pid 6293) 206s
  19. #查看GitLab版本号
  20. [root@Git02 ~]# cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
  21. 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

  1. #解压GitLab中文版补丁包
  2. [root@Git02 ~]# tar xf gitlab-11-2-stable-zh.tar.gz
  3. #查看系统已经安装的GitLab版本号
  4. [root@Git02 ~]# cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
  5. 11.2.3
  6. #查看解压后的补丁包版本号
  7. [root@Git02 ~]# cat gitlab-11-2-stable-zh/VERSION
  8. 11.2.3
  9. 说明:
  10. 补丁包版本号和安装的GitLab版本号需要一致
  1. #备份英文版GitLab
  2. [root@Git02 ~]# cp -r /opt/gitlab/embedded/service/gitlab-rails{,.bak}
  3. #将中文补丁包的内容覆盖英文版
  4. [root@Git02 yuanmabao]# pwd
  5. /root/yuanmabao
  6. [root@Git02 ~]# /bin/cp -rf gitlab-11-2-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails/
  7. /bin/cp: 无法以目录"gitlab-11-2-stable-zh/log" 来覆盖非目录"/opt/gitlab/embedded/service/gitlab-rails/log"
  8. /bin/cp: 无法以目录"gitlab-11-2-stable-zh/tmp" 来覆盖非目录"/opt/gitlab/embedded/service/gitlab-rails/tmp"
  9. 说明:
  10. 此报错不用管,因为已经设置过root密码,登陆过,所以会报错
  11. #重新配置GitLab
  12. [root@Git02 ~]# gitlab-ctl reconfigure
  13. #重新启动GitLab
  14. [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,但是在企业中,这个端口经常被别的服务占用,所以我们还需要更换端口号

  1. [root@Git02 ~]# cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.bak
  2. [root@Git02 ~]# cat -n /etc/gitlab/gitlab.rb | sed -n '13p;943p'
  3. 13 external_url 'http://192.168.200.53:8888'
  4. 943 nginx['listen_port'] = 8888
  5. #重新配置GitLab
  6. [root@Git02 ~]# gitlab-ctl reconfigure
  7. #重启动GitLab
  8. [root@Git02 ~]# gitlab-ctl restart

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

image.png-14.3kB

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

  1. #在Git01客户端上
  2. [root@Git01 mycode]# pwd
  3. /mycode
  4. [root@Git01 mycode]# git branch
  5. linux
  6. * master #当前在master分支
  7. #添加远程GitLab仓库管理
  8. [root@Git01 mycode]# git remote add origin http://192.168.200.53:8888/root/yunjisuan.git
  9. [root@Git01 mycode]# git remote -v
  10. origin http://192.168.200.53:8888/root/yunjisuan.git (fetch)
  11. origin http://192.168.200.53:8888/root/yunjisuan.git (push)
  12. test https://github.com/ywb1108/yunwei.git (fetch)
  13. test https://github.com/ywb1108/yunwei.git (push)
  14. #推送本地仓库master分支到远程仓库GitLab上
  15. [root@Git01 mycode]# git push origin master
  16. Username for 'http://192.168.200.53:8888': root
  17. Password for 'http://root@192.168.200.53:8888': ywb971108
  18. 对象计数中: 16, 完成.
  19. Delta compression using up to 2 threads.
  20. 压缩对象中: 100% (6/6), 完成.
  21. 写入对象中: 100% (16/16), 1.19 KiB | 0 bytes/s, 完成.
  22. Total 16 (delta 1), reused 0 (delta 0)
  23. To http://192.168.200.53:8888/root/yunjisuan.git
  24. * [new branch] master -> master
  1. #推送本地仓库dev分支到远程仓库GitLab上
  2. [root@Git01 mycode]# git branch
  3. dev
  4. * master
  5. [root@Git01 mycode]# git checkout dev
  6. 切换到分支 'dev'
  7. [root@Git01 mycode]# git branch
  8. * dev
  9. master
  10. [root@Git01 mycode]# git push origin dev
  11. Username for 'http://192.168.200.53:8888': root
  12. Password for 'http://root@192.168.200.53:8888': ywb971108
  13. 对象计数中: 3, 完成.
  14. 写入对象中: 100% (3/3), 306 bytes | 0 bytes/s, 完成.
  15. Total 3 (delta 0), reused 0 (delta 0)
  16. remote:
  17. remote: To create a merge request for dev, visit:
  18. remote: http://192.168.200.53:8888/root/yunjisuan/merge_requests/new?merge_request%5Bsource_branch%5D=dev
  19. remote:
  20. To http://192.168.200.53:8888/root/yunjisuan.git
  21. * [new branch] dev -> dev
  1. #推送本地仓库标签V1.0到远程仓库GitLab上
  2. [root@Git01 mycode]# git tag
  3. v1.0
  4. [root@Git01 mycode]# git push origin v1.0
  5. Username for 'http://192.168.200.53:8888': root
  6. Password for 'http://root@192.168.200.53:8888':
  7. 对象计数中: 1, 完成.
  8. 写入对象中: 100% (1/1), 185 bytes | 0 bytes/s, 完成.
  9. Total 1 (delta 0), reused 0 (delta 0)
  10. To http://192.168.200.53:8888/root/yunjisuan.git
  11. * [new tag] v1.0 -> v1.0

image.png-98.8kB

4.5.4 尝试在本地仓库克隆GitLab的项目dev分支到本地仓库
  1. #创建Git工作目录
  2. [root@Git01 ~]# mkdir -p /GitLab
  3. [root@Git01 ~]# cd /GitLab
  4. [root@Git01 GitLab]# git init
  5. 初始化空的 Git 仓库于 /GitLab/.git/
  1. #克隆远程仓库GitLab的Linux分支
  2. [root@Git01 GitLab]# git clone -b dev http://192.168.200.53:8888/root/yunjisuan.git
  3. 正克隆到 'yunjisuan'...
  4. Username for 'http://192.168.200.53:8888': root
  5. Password for 'http://root@192.168.200.53:8888':
  6. remote: Enumerating objects: 20, done.
  7. remote: Counting objects: 100% (20/20), done.
  8. remote: Compressing objects: 100% (8/8), done.
  9. remote: Total 20 (delta 1), reused 0 (delta 0)
  10. 展开对象中: 100% (20/20), 完成.
  11. 检查连接... 完成。
  1. [root@Git01 GitLab]# ls
  2. yunjisuan
  3. [root@Git01 GitLab]# cd yunjisuan/
  4. [root@Git01 yunjisuan]# ls
  5. benet.txt
  6. [root@Git01 yunjisuan]# cat benet.txt
  7. www
  8. www
  9. www
  10. 远程分支提交测试
  11. [root@Git01 yunjisuan]# git branch
  12. * dev
4.5.5 配置GitLab的SSH密钥连接方式
  1. #在Git01客户端生成密钥对
  2. [root@Git01 ~]# ssh-keygen -t rsa -C '1773464408@qq.com'
  3. Generating public/private rsa key pair.
  4. Enter file in which to save the key (/root/.ssh/id_rsa):
  5. Created directory '/root/.ssh'.
  6. Enter passphrase (empty for no passphrase):
  7. Enter same passphrase again:
  8. Your identification has been saved in /root/.ssh/id_rsa.
  9. Your public key has been saved in /root/.ssh/id_rsa.pub.
  10. The key fingerprint is:
  11. SHA256:m1F7R3PI9FTjaLU1nMtapqKwt0jOVeOjm//kL1i6bME 1773464408@qq.com
  12. The key's randomart image is:
  13. +---[RSA 2048]----+
  14. | o+*|
  15. | o+*=|
  16. | . o*o+|
  17. | . ... B |
  18. | S oo. * |
  19. | . +oE.= |
  20. | .=..o*. |
  21. | +.oo+++. |
  22. | +.==+ooo. |
  23. +----[SHA256]-----+
  1. [root@Git01 ~]# cat /root/.ssh/id_rsa.pub #公钥内容,复制到GitLab上
  2. ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDeaghn5xFg42nPFOFGUUfY4ehtObN50ifilaOuq9n0G/qowOAt2wrPrjmPbINNW1zaWC2h0O7JWz/WVUqhsX+n7GpMwSBeAZZAZinxjjyR5RZjI5DKq0nXr8olA7v75d97/wsSt3RFLek6/J8qyPJzIl0iRzDVYPZ9Duw2iczqoULkufgYuxmMKsxDPNddtBBWaELq4UiTRODIy0KIh1trYJRGSrowx+/gtVOJhqZlMP//iKFgG3EqzX8OrsSeWZptgAW235QUGOD4iQFHsy7jpnByvsJs+n+FqZXkHrajo41oCF+262MLyjx0Mol/SnDxMjrBZe3xssCUHiZHfNVv 1773464408@qq.com

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

image.png-40.6kB

image.png-108.8kB

image.png-26.1kB

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

4.6 配置GitLab邮件服务

  • 配置邮箱服务的用途:
    • 有合并请求时,邮件通知
    • 账号注册时,邮件验证
    • 修改密码时,通过邮件修改
  • 配置步骤:
    • 开启QQ邮箱的smtp服务
    • 修改gitlab配置
    • 测试邮件服务是否正常
4.6.1 开启GitLab服务postfix服务并开启QQ邮箱的smtp服务
  1. [root@Git02 ~]# systemctl start postfix
  2. [root@Git02 ~]# systemctl enable postfix
  3. [root@Git02 ~]# systemctl status postfix
  4. #以下省略。。。

image.png-64.2kB

image.png-47.1kB

image.png-32.2kB

4.6.2 修改gitlab配置文件/etc/gitlab/gitlab.rb
  1. [root@Git02 ~]# cat -n /etc/gitlab/gitlab.rb | sed -n '53p;472,480p;618p'
  2. 53 gitlab_rails['gitlab_email_from'] = '1773464408@qq.com' #GitLab默认邮箱
  3. 472 gitlab_rails['smtp_enable'] = true #开启功能
  4. 473 gitlab_rails['smtp_address'] = "smtp.qq.com" #QQ的smtp服务
  5. 474 gitlab_rails['smtp_port'] = 465
  6. 475 gitlab_rails['smtp_user_name'] = "1773464408@qq.com" #smtp用户邮箱
  7. 476 gitlab_rails['smtp_password'] = "gxdnyozoimckgdfe" #开通QQsmtp时返回的字符串
  8. 477 gitlab_rails['smtp_domain'] = "qq.com" #smtp域名
  9. 478 gitlab_rails['smtp_authentication'] = "login"
  10. 479 gitlab_rails['smtp_enable_starttls_auto'] = true
  11. 480 gitlab_rails['smtp_tls'] = true
  12. 618 user['git_user_email'] = "1773464408@qq.com" #git用户邮箱
  1. #重新加载GitLab配置文件
  2. [root@Git02 ~]# gitlab-ctl reconfigure
  3. #重启动GitLab服务
  4. [root@Git02 ~]# gitlab-ctl restart
  5. #进入GitLab控制台进行邮件发送测试
  6. [root@Git02 ~]# gitlab-rails console #开启GitLab控制台
  7. -------------------------------------------------------------------------------------
  8. GitLab: 11.2.3 (06cbee3)
  9. GitLab Shell: 8.1.1
  10. postgresql: 9.6.8
  11. -------------------------------------------------------------------------------------
  12. Loading production environment (Rails 4.2.10)
  13. irb(main):001:0> Notify.test_email('1773464408@qq.com','this is title','hello,杨哥!').deliver_now
  14. #以下省略。。。
  15. 特别说明:
  16. 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开发人员: 可以进行代码的读写(普通程序员)
  • Master主程序员: 可以添加项目成员,添加标签,创建和保护分支(产品经理)
  • Owner所有者: 拥有所有权限(一般不用此权限)

image.png-47.8kB

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

image.png-24.3kB

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

image.png-31.1kB

image.png-46.9kB

image.png-51.6kB

4.7.5 进行组成员的项目提交和克隆测试
  1. #进行组成员代码提交测试
  2. [root@Git01 /]# mkdir benet
  3. [root@Git01 /]# cd benet/
  4. [root@Git01 benet]# git init
  5. 初始化空的 Git 仓库于 /benet/.git/
  1. #进行克隆测试
  2. [root@Git01 benet]# git clone http://192.168.200.53:8888/test/benet.git
  3. 正克隆到 'benet'...
  4. Username for 'http://192.168.200.53:8888': 3523916661@qq.com
  5. Password for 'http://3523916661@qq.com@192.168.200.53:8888': xiaolinlin
  6. remote: Enumerating objects: 3, done.
  7. remote: Counting objects: 100% (3/3), done.
  8. remote: Total 3 (delta 0), reused 0 (delta 0)
  9. 展开对象中: 100% (3/3), 完成.
  10. 检查连接... 完成。
  11. [root@Git01 benet]# ls
  12. benet
  13. [root@Git01 benet]# cd benet/
  14. [root@Git01 benet]# ls
  15. README.md
  16. [root@Git01 benet]# cat README.md
  17. # benet
  1. #推送代码到远程GitLab
  2. [root@Git01 benet]# echo "welcome to yunjisuan" >> README.md
  3. [root@Git01 benet]# cat README.md
  4. # benet
  5. welcome to yunjisuan
  6. [root@Git01 benet]# git add *
  7. [root@Git01 benet]# git commit -m "提交測試"
  8. [master 3055139] 提交測試
  9. 1 file changed, 1 insertion(+)
  10. [root@Git01 benet]# git remote -v
  11. origin http://192.168.200.53:8888/test/benet.git (fetch)
  12. origin http://192.168.200.53:8888/test/benet.git (push)
  13. [root@Git01 benet]# git push http://192.168.200.53:8888/test/benet.git
  14. Username for 'http://192.168.200.53:8888': 3523916661@qq.com
  15. Password for 'http://3523916661@qq.com@192.168.200.53:8888': xiaolinlin
  16. 对象计数中: 3, 完成.
  17. 写入对象中: 100% (3/3), 285 bytes | 0 bytes/s, 完成.
  18. Total 3 (delta 0), reused 0 (delta 0)
  19. To http://192.168.200.53:8888/test/benet.git
  20. 0b723ba..3055139 master -> master

image.png-19.1kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注