首页 > 其他 > 详细

分布式版本控制系统-Github

时间:2020-08-25 14:39:39      阅读:79      评论:0      收藏:0      [点我收藏+]

一、Git、Github、Gitlab 的区别

Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Github是在线的基于Git的代码托管服务。 GitHub是2008年由Ruby on Rails编写而成。GitHub同时提供付费账户和免费账户。这两种账户都可以创建公开的代码仓库,只有付费账户可以创建私有的代码仓库。 Gitlab解决了这个问题, 可以在上面创建免费的私人repo。

二、Git 与 SVN 区别

GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。

如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。

Git 与 SVN 区别

  1. GIT是分布式的,SVN不是:这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。
  2. GIT把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。
  3. GIT分支和SVN的分支不同:分支在SVN中一点不特别,就是版本库中的另外的一个目录。
  4. GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。
  5. GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

三、部署Git 服务

创建git仓库

git-server上的操作:

[root@server ~]# yum install git git-core gitweb -y
[root@server ~]# useradd git
[root@server ~]# passwd git
[root@server ~]# mkdir /git-root/
[root@server ~]# cd /git-root/
[root@server git-root]# git init --bare shell.git
Initialized empty Git repository in /git-root/shell.git/
注意:
git init 和 git init --bare 的区别:
使用--bare选项时,不再生成.git目录,而是只生成.git目录下面的版本历史记录文件,这些版本历史记录文件也不再存放在.git目录下面,而是直接存放在版本库的根目录下面.
用"git init"初始化的版本库用户也可以在该目录下执行所有git方面的操作。但别的用户在将更新push上来的时候容易出现冲突。
使用”git init --bare”方法创建一个所谓的裸仓库,之所以叫裸仓库是因为这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作,如果你硬要操作的话,只会得到下面的错误(”This operation must be run in a work tree”)这个就是最好把远端仓库初始化成bare仓库的原因

[root@server git-root]# chown -R git:git shell.git
[root@server git-root]# su - git
[git@server ~]$ ssh-keygen -t rsa
[git@server ~]$ cd .ssh/
[git@server .ssh]$ cp id_rsa.pub authorized_keys
[git@server .ssh]$ vim authorized_key
[git@server .ssh]$ logout

git仓库测试

git-client上的操作:

[root@server ~]# ssh-keygen
[root@server ~]# ssh-copy-id git@192.168.1.178
[root@server ~]# git clone git@192.168.1.178:/git-root/shell.git
[root@server ~]# ls
rh  shell
[root@server ~]# cd shell/
[root@server shell]# vim test.sh
[root@server shell]# git add test.sh
[root@server shell]# git config --global user.email "you@example.com"
[root@server shell]# git config --global user.name "Your Name"
[root@server shell]# git commit -m ‘first commit‘
[master (root-commit) 33c5fbf] first commit
 1 file changed, 2 insertions(+)
 create mode 100644 test1.sh
[root@server shell]# git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 230 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.1.178:/git-root/shell.git
 * [new branch]      master -> master

四、Git工作流程

一般工作流程如下:

  • 克隆 Git 资源作为工作目录。
  • 在克隆的资源上添加或修改文件。
  • 如果其他人修改了,你可以更新资源。
  • 在提交前查看修改。
  • 提交修改。
  • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

  Git 的工作流程示意图:

技术分享图片

五、Git基本概念

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫stage, 或index。一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

  工作区、版本库中的暂存区和版本库之间的关系的示意图:

技术分享图片

  •   图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。

  •   图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

  •   图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。

  •   当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

  •   当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

  •   当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

  •   当执行 "git rm --cached " 命令时,会直接从暂存区删除文件,工作区则不做出改变。

  •   当执行 "git checkout ." 或者 "git checkout -- " 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

  •   当执行 "git checkout HEAD ." 或者 "git checkout HEAD " 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

六、Git 客户端安装使用

1、 Git 安装配置

[root@server ~]# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
[root@server ~]# yum -y install git git-all git-core
[root@server ~]# git --version
[root@server ~]# git version 1.7.1

2、Git 配置

Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。

这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
  • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

1、Git 用户信息

配置个人的用户名称和电子邮件地址:

[root@server ~]# git config --global user.name "qfedu"
[root@server ~]# git config --global user.email test@qq.com

如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。

如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。

2、文本编辑器

设置Git默认使用的文本编辑器, 一般可能会是 Vi 或者 Vim。如果你有其他偏好,比如 Emacs 的话,可以重新设置

[root@server ~]# git config --global core.editor emacs

3、差异分析工具

还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话:

[root@server ~]# git config --global merge.tool vimdiff

Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的输出信息。

当然,你也可以指定使用自己开发的工具

4、查看配置信息

要检查已有的配置信息,可以使用 git config --list 命令:

[root@server ~]# git config --list
http.postbuffer=2M
user.name=runoob
user.email=test@runoob.com

有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不过最终 Git 实际采用的是最后一个。

这些配置我们也可以在 ~/.gitconfig/etc/gitconfig 看到,如下所示:

[root@server ~]# vim ~/.gitconfig 

显示内容如下所示:

[http]
    postBuffer = 2M
[user]
    name = git
    email = test@server.com

也可以直接查阅某个环境变量的设定,只要把特定的名字跟在后面即可,像这样:

[root@server ~]# git config user.name
git

3、Git 使用

1、ssh 链接

客户机上产生公钥上传到gitlab的SSH-Keys里,git clone下载和git push上传都没问题,这种方式很安全

2、http 链接(两种方式实现)

1、修改代码里的 .git/config 文件添加登录用户名密码
[root@server ~]# cd .git
[root@server ~]# cat config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = http://username:password@server@172.17.0.39:sauser/ansible.git
[branch "master"]
remote = origin
merge = refs/heads/master
2、 执行命令设置登录用户和密码
# cd到根目录,执行
[root@server ~]# git config --global credential.helper store  # 执行之后会在.gitconfig文件中多添加以下选项
  [credential]         
  		helper = store
# cd到项目目录,执行git pull命令,会提示输入账号密码。输完这一次以后就不再需要,并且会在根目录生成一个.git-credentials文件
[root@server ~]# git pull 
  Username for ‘http://172.17.0.39:sauser/ansible.git‘: 
  xxxx@xxxx.com Password for ‘https://xxxx@xxxx.com@172.17.0.39:sauser/ansible.git‘:
[root@server ~]# cat .git-credentials
  https://Username:Password@server.oschina.net
# 之后pull/push代码都不再需要输入账号密码了

3、设置身份验证

注意:设定本机用户名,绑定邮箱,让远程服务器知道机器的身份

[root@server ~]# git config --global user.name "user_name" 
[root@server ~]# git config --global user.email "XXXXX@XX.com"

4、本地项目与远程服务器项目之间的交互

1、如果你没有最新的代码,希望从头开始

[root@server ~]# git clone git@XXX.git      # 这里是项目的地址(可从项目主页复制),将远程服务器的内容完全复制过来 
[root@server ~]# cd BGBInspector_V01        # clone 之后进入该项目的文件夹 
[root@server ~]# touch README.md           # 新建readme文件 
[root@server ~]# git add README.md          # 将新的文件添加到git的暂存区 
[root@server ~]# git commit -m ‘Its note:add a readme file’ # 将暂存区的文件提交到某一个版本保存下来,并加上注释 
[root@server ~]# git push -u origin master  # 将本地的更改提交到远程服务器

2、如果你已经有一个新版代码,希望直接把本地的代码替换到远程服务器

[root@server ~]# cd existing_folder          #进入代码存在的文件夹,或者直接在该文件夹打开
[root@server ~]# git init           # 初始化 
[root@server ~]# git remote add origin git@XXX.git  #添加远程项目地址(可从项目主页复制) 
[root@server ~]# git add .                   #添加该文件夹中所有的文件到git的暂存区 
[root@server ~]# git commit -m ‘note’        #提交所有代码到本机的版本库 
[root@server ~]# git push -u origin master   #将本地的更改提交到远程服务器
  • git 中 clone过来的时候,git 不会对比本地和服务器的文件,也就不会有冲突,

  • 建议确定完全覆盖本地的时候用 clone,不确定会不会有冲突的时候用 git pull,将远程服务器的代码download下来

5、常用的git 命令

[root@server ~]# git init                      # 初始化 
[root@server ~]# git add main.cpp              # 将某一个文件添加到暂存区 
[root@server ~]# git add .                     # 将文件夹下的所有的文件添加到暂存区 
[root@server ~]# git commit -m ‘note‘          # 将暂存区中的文件保存成为某一个版本 
[root@server ~]# git log                       # 查看所有的版本日志 
[root@server ~]# git status                    # 查看现在暂存区的状况 
[root@server ~]# git diff                      # 查看现在文件与上一个提交-commit版本的区别 
[root@server ~]# git reset --hard HEAD^        # 回到上一个版本 
[root@server ~]# git reset --hard XXXXX        # XXX为版本编号,回到某一个版本 
[root@server ~]# git pull origin master        # 从主分支pull到本地 
[root@server ~]# git push -u origin master     # 从本地push到主分支 
[root@server ~]# git pull                      # pull默认主分支 
[root@server ~]# git push                      # push默认主分支 ...

6、版本穿梭

1、版本回退
# 用 git log 命令查看:
# 每一个提交的版本都唯一对应一个 commit 版本号,
# 使用 git reset 命令退到上一个版本:
[root@server ~]# git reset --hard HEAD^
[root@server ~]# git reflog                    # 查看命令历史,以便确定要回到哪个版本
[root@server ~]# git reset --hard commit_id    # 比如git reset --hard 3628164(不用全部输入,输入前几位即可)
2、分支管理

1、创建分支

[root@server ~]# git checkout -b dev     #创建dev分支,然后切换到dev分支
[root@server ~]# git checkout            #命令加上-b参数表示创建并切换,相当于以下两条命令:
[root@server ~]# git branch dev git checkout dev
[root@server ~]# git branch              #命令查看当前分支,
[root@server ~]# git branch              #命令会列出所有分支,当前分支前面会标一个*号
[root@server ~]# git branch * dev   master
[root@server ~]# git add readme.txt git commit -m "branch test"  # 在dev分支上正常提交.

2、分支切换

[root@server ~]# git checkout master     #切换回master分支
# 查看一个readme.txt文件,刚才添加的内容不见了,因为那个提交是在dev分支上,而master分支此刻的提交点并没有变  

3、合并分支

[root@server ~]# git merge dev           #把dev分支的工作成果合并到master分支上
[root@server ~]# git merge               #命令用于合并指定分支到当前分支。
# 合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。
注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。
[root@server ~]# git branch -d dev       #删除dev分支了:
删除后,查看branch,就只剩下master分支了.
3、解决冲突
[root@server ~]# git checkout -b feature1        # 创建新的feature1分支
# 修改readme.txt最后一行,改为:
Creating a new branch is quick AND simple.

[root@server ~]# git add readme.txt              # 在feature1分支上提交
[root@server ~]# git commit -m "AND simple"
[root@server ~]# git checkout master             #切换到master分支
Switched to branch ‘master‘ Your branch is ahead of ‘origin/master‘ by 1 commit.
Git还会自动提示我们当前master分支比远程的master分支要超前1个提交。

在master分支上把readme.txt文件的最后一行改为:
Creating a new branch is quick & simple.
[root@server ~]# git add readme.txt 
[root@server ~]# git commit -m "& simple"

现在,master分支和feature1分支各自都分别有新的提交
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:
git merge feature1 Auto-merging readme.txt CONFLICT (content): 
Merge conflict in readme.txt Automatic merge failed; 
fix conflicts and then commit the result.
readme.txt文件存在冲突,必须手动解决冲突后再提交。
[root@server ~]# git status 可以显示冲突的文件;
直接查看readme.txt的内容:
Git is a distributed version control system.
Git is free software distributed under the GPL. 
Git has a mutable index called stage. 
Git tracks changes of files. 
<<<<<<< HEAD Creating a new branch is quick & simple. ======= Creating a new branch is quick AND simple. >>>>>>> feature1
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改后保存再提交:
[root@server ~]# git add readme.txt  
[root@server ~]# git commit -m "conflict fixed" 
[master 59bc1cb] conflict fixed
最后,删除feature1分支:
[root@server ~]# git branch -d feature1 
Deleted branch feature1 (was 75a857c).

七、Github 远程仓库

1、github.com 注册账户

2、github 上创建仓库

3、本地服务器生成 ssh 公钥

[root@server ~]# ssh-keygen -t rsa -C ‘meteor@163.com‘  # 邮箱要与github上注册的相同
[root@server ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVThfq4brrlsPGtAknVB0TLPx+7Dd3qlxTbSIrUOsGC5Y8JuNqVTlIntZB4oNj8cSQrWvec9CKm0a8o7WwaJIiqpxurz+YpQHP2KbapftKIxsX4hPf/z+p0El1U6arQa35/xmNsq+cJLH/bDdRG+EMDhuCBmjVZOlLj/hEdeIT6s56AnnCkaWoF+sq58KCF7Tk54jRbs/YiyE4SN7FuA70r+07sA/uj0+lmuk4E190KtQUELhjX/E9stivlqiRhxnKvVUqXDywsjfM8Rtvbi4Fg9R8Wt9fpd4QwnWksYUoR5qZJFYXO4hSZrUnSMruPK14xXjDJcFDcP2eHIzKgLD1 meteor@163.com

4、 github 添加 ssh 公钥

复制以上的公钥,在 github 中添加ssh key

5、测试连接

[root@server ~]# yum install git
........
[root@server ~]# ssh -T git@serverhub.com
The authenticity of host ‘github.com (13.250.177.223)‘ can‘t be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘github.com,13.250.177.223‘ (RSA) to the list of known hosts.
Hi meteor! You‘ve successfully authenticated, but GitHub does not provide shell access.
[root@server ~]#

6、连接远程仓库(创建一个测试存储库)

技术分享图片

# 在 github 网站新建一个仓库,命名为linux
~~~
[root@server ~]# cd /opt
[root@server ~]# mkdir linux
[root@server ~]# mkdir linux
[root@server ~]# cd linux
~~~
# git 初始化,然后做第一个基本的git操作(需要在github上创建存储库)
[root@server ~]# git init
[root@server ~]# touch README
[root@server ~]# git add README
[root@server ~]# git commit -m ‘first commit‘
[root@server ~]# git remote add origin git@serverhub.com:userhub/linux.git
~~~
# 若出现origin已经存在的错误,删除origin
[root@server linux]# git remote rm origin
# 现在继续执行push到远端
~~~
[root@server linux]# git remote add origin git@serverhub.com:userhub/linux.git
[root@server linux]# git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 205 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@serverhub.com:fakehydra/linux-.git
 * [new branch]      master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
# 注意
# 设置存储库链接
[root@server ~]# git remote set-url origin git@serverhub.com:userhub/linux.git
# 如果 push 失败,合并分支到 master 再 push
[root@server ~]# git pull --rebase origin master

八、Gitlab Server 部署

1、环境配置

关闭防火墙、SELinux

开启邮件服务

[root@server ~]# systemctl start postfix
[root@server ~]# systemctl enable postfix

2、部署 Gitlab

1、安装 gitlab 依赖包

centos7:
[root@server ~]# yum install -y curl openssh-server openssh-clients postfix cronie policycoreutils-python
# gitlab-ce 10.x.x以后的版本需要依赖policycoreutils-python

centos8:
[root@server ~]# yum install -y curl openssh-server openssh-clients postfix cronie  policycoreutils-python-utils

2、添加官方源

[root@server ~]# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash

因为官方源太慢,可以使用国内清华yum源,配置如下

[root@server ~]# vim /etc/yum.repos.d/gitlab-ce.repo
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1

3、安装 Gitlab

[root@server ~]# yum -y install gitlab-ce                    # 自动安装最新版
[root@server ~]# yum -y install gitlab-ce-x.x.x				# 安装指定版本Gitlab

4、配置 Gitlab

1、查看Gitlab版本
[root@server ~]# head -1 /opt/gitlab/version-manifest.txt
gitlab-ce 10.1.1
2、Gitlab 配置登录链接
#设置登录链接
[root@server ~]# vim /etc/gitlab/gitlab.rb
***
## GitLab URL
##! URL on which GitLab will be reachable.
##! For more details on configuring external_url see:
##! https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab
# 没有域名,可以设置为本机IP地址
external_url ‘http://172.17.0.61‘
***
[root@server ~]# grep "^external_url" /etc/gitlab/gitlab.rb
external_url ‘http://172.17.0.61‘     #绑定监听的域名或IP
3、初始化 Gitlab

第一次使用配置时间较长

[root@server ~]# gitlab-ctl reconfigure   
.....

注意:
	语言环境问题:如果碰到之后的解决方案如下,需要重新登录
 	[root@wing ~]# echo "export LC_ALL=en_US.UTF-8"  >>  /etc/profile 
4、启动 Gitlab 服务
[root@server ~]# gitlab-ctl start
ok: run: gitaly: (pid 22896) 2922s
ok: run: gitlab-monitor: (pid 22914) 2921s
ok: run: gitlab-workhorse: (pid 22882) 2922s
ok: run: logrotate: (pid 22517) 2987s
ok: run: nginx: (pid 22500) 2993s
ok: run: node-exporter: (pid 22584) 2974s
ok: run: postgres-exporter: (pid 22946) 2919s
ok: run: postgresql: (pid 22250) 3047s
ok: run: prometheus: (pid 22931) 2920s
ok: run: redis: (pid 22190) 3053s
ok: run: redis-exporter: (pid 22732) 2962s
ok: run: sidekiq: (pid 22472) 3005s
ok: run: unicorn: (pid 22433) 3011s

[git@server ~]# lsof -i:80
COMMAND   PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   22500       root    7u  IPv4  50923      0t0  TCP *:http (LISTEN)
nginx   22501 gitlab-www    7u  IPv4  50923      0t0  TCP *:http (LISTEN)
5、Gitlab 设置 HTTPS 方式
  • 如果想要以上的 https 方式正常生效使用,则需要把 letsencrypt 自动生成证书的配置打开,这样在执行重新让配置生效命令 (gitlab-ctl reconfigure) 的时候会自动给域名生成免费的证书并自动在 gitlab 自带的 nginx 中加上相关的跳转配置,都是全自动的,非常方便。
[root@server ~]# vim /etc/gitlab/gitlab.rb
letsencrypt[‘enable‘] = true 
letsencrypt[‘contact_emails‘] = [‘caryyu@qq.com‘]     # 添加联系人的电子邮件地址
6、Gitlab 添加smtp邮件功能
[git@server ~]# vim /etc/gitlab/gitlab.rb
postfix 并非必须的;根据具体情况配置,以 SMTP 的为例配置邮件服务器来实现通知;参考配置如下: 
### Email Settings
gitlab_rails[‘gitlab_email_enabled‘] = true
gitlab_rails[‘gitlab_email_from‘] = ‘276267003@qq.com‘
gitlab_rails[‘gitlab_email_display_name‘] = ‘gitlab‘
gitlab_rails[‘gitlab_email_reply_to‘] = ‘276267003@qq.com‘
gitlab_rails[‘gitlab_email_subject_suffix‘] = ‘[gitlab]‘
gitlab_rails[‘smtp_enable‘] = true
gitlab_rails[‘smtp_address‘] = "smtp.qq.com"
gitlab_rails[‘smtp_port‘] = 465
gitlab_rails[‘smtp_user_name‘] = "276267003@qq.com"
gitlab_rails[‘smtp_password‘] = "kktohrvdryglbjjh" #这是我的qq邮箱授权码
gitlab_rails[‘smtp_domain‘] = "smtp.qq.com"
gitlab_rails[‘smtp_authentication‘] = "login"
gitlab_rails[‘smtp_enable_starttls_auto‘] = true
gitlab_rails[‘smtp_tls‘] = true


[git@server ~]# gitlab-ctl stop
[git@server ~]# gitlab-ctl reconfigure  #修改配置后需要初始化配置
......

ok: down: gitaly: 0s, normally up
ok: down: gitlab-monitor: 1s, normally up
ok: down: gitlab-workhorse: 0s, normally up
ok: down: logrotate: 1s, normally up
ok: down: nginx: 0s, normally up
ok: down: node-exporter: 1s, normally up
ok: down: postgres-exporter: 0s, normally up
ok: down: postgresql: 0s, normally up
ok: down: prometheus: 0s, normally up
ok: down: redis: 0s, normally up
ok: down: redis-exporter: 1s, normally up
ok: down: sidekiq: 0s, normally up
ok: down: unicorn: 1s, normally up

[git@server ~]# gitlab-ctl start
ok: run: gitaly: (pid 37603) 0s
ok: run: gitlab-monitor: (pid 37613) 0s
ok: run: gitlab-workhorse: (pid 37625) 0s
ok: run: logrotate: (pid 37631) 0s
ok: run: nginx: (pid 37639) 1s
ok: run: node-exporter: (pid 37644) 0s
ok: run: postgres-exporter: (pid 37648) 1s
ok: run: postgresql: (pid 37652) 0s
ok: run: prometheus: (pid 37660) 1s
ok: run: redis: (pid 37668) 0s
ok: run: redis-exporter: (pid 37746) 0s
ok: run: sidekiq: (pid 37750) 1s
ok: run: unicorn: (pid 37757) 0s
[git@server ~]# gitlab-ctl start
7、Gitlab 发送邮件测试
[git@server ~]# gitlab-rails console 
[root@wing ~]# gitlab-rails console
---------------------------------------------------------------------
 GitLab:       12.10.1 (e658772bd63) FOSS
 GitLab Shell: 12.2.0
 PostgreSQL:   11.7
---------------------------------------------------------------------
Loading production environment (Rails 6.0.2)
irb(main):003:0> 
irb(main):004:0> Notify.test_email(‘276267003@qq.com‘, ‘Message Subject‘, ‘Message Body‘).deliver_now  //输入测试命令,回车
Notify#test_email: processed outbound mail in 5.2ms
Delivered mail 5eafceaa250a_1d063fb777add9a08601a@wing.mail (1430.1ms)
Date: Mon, 04 May 2020 16:13:30 +0800
From: gitlab <276267003@qq.com>
Reply-To: gitlab <276267003@qq.com>
To: 276267003@qq.com
Message-ID: <5eafceaa250a_1d063fb777add9a08601a@wing.mail>
Subject: Message Subject
Mime-Version: 1.0
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: 7bit
Auto-Submitted: auto-generated
X-Auto-Response-Suppress: All

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Message Body</p></body></html>

=> #<Mail::Message:70056859616080, Multipart: false, Headers: <Date: Mon, 04 May 2020 16:13:30 +0800>, <From: gitlab <276267003@qq.com>>, <Reply-To: gitlab <276267003@qq.com>>, <To: 276267003@qq.com>, <Message-ID: <5eafceaa250a_1d063fb777add9a08601a@wing.mail>>, <Subject: Message Subject>, <Mime-Version: 1.0>, <Content-Type: text/html; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>, <Auto-Submitted: auto-generated>, <X-Auto-Response-Suppress: All>>
irb(main):005:0> 

去qq邮箱web界面查看是否收到邮件

技术分享图片

3、Gitlab 的使用

在浏览器中输入 http://192.168.1.178/ ,然后 change password: ,并使用root用户登录 即可 (后续动作根据提示操作)

1、Gitlab 命令行修改密码

[root@server ~]# gitlab-rails console production
irb(main):001:0>user = User.where(id: 1).first      # id为1的是超级管理员
irb(main):002:0>user.password = ‘yourpassword‘      # 密码必须至少8个字符
irb(main):003:0>user.save!                          # 如没有问题 返回true
exit 												# 退出

2、Gitlab服务管理

[root@server ~]# gitlab-ctl start                        # 启动所有 gitlab 组件;
[root@server ~]# gitlab-ctl stop                         # 停止所有 gitlab 组件;
[root@server ~]# gitlab-ctl restart                      # 重启所有 gitlab 组件;
[root@server ~]# gitlab-ctl status                       # 查看服务状态;
[root@server ~]# gitlab-ctl reconfigure                  # 初始化服务;
[root@server ~]# vim /etc/gitlab/gitlab.rb               # 修改默认的配置文件;
[root@server ~]# gitlab-ctl tail                         # 查看日志;

3、登陆 Gitlab

技术分享图片

如果需要手工修改nginx的port ,可以在gitlab.rb中设置 nginx[‘listen_port‘] = 8000 ,然后再次 gitlab-ctl reconfigure即可

登录 gitlab 如下所示(首次登陆设置 root 密码):
技术分享图片

4、创建项目组 group

组名为plat-sp ,
技术分享图片

技术分享图片

5、去掉用户的自动注册功能(安全)

admin are -> settings -> Sign-up Restrictions 去掉钩钩,然后拉到最下面保存,重新登录
技术分享图片

九、Gitlab 开发代码提交处理流程

1、公司代码提交合并流程

  • PM(项目主管/项目经理)在gitlab创建任务,分配给开发人员

  • 开发人员领取任务后,在本地使用git clone拉取代码库

  • 开发人员创建开发分支(git checkout -b dev),并进行开发

  • 开发人员完成之后,提交到本地仓库(git commit )

  • 开发人员在gitlab界面上申请分支合并请求(Merge request)

  • PM在gitlab上查看提交和代码修改情况,确认无误后,确认将开发人员的分支合并到主分支(master)

  • 开发人员在gitlab上Mark done确认开发完成,并关闭issue。这一步在提交合并请求时可以通过描述中填写"close #1"等字样,可以直接关闭issue

2、创建项目管理用户 Tompson

技术分享图片

同样的方法,再创建 Eric 、Hellen 用户。用户添加完毕后,gitlab 会给用户发一封修改密码的邮件,各用户需要登录自己的邮箱,并点击相关的链接,设置新密码。

3、将 Tompson 用户添加到组中,指定T为本组的 owner

技术分享图片

4、同样的方法将用户Eric、Hellen 添加到组中,并指定为Developer

技术分享图片

5、使用 Tompson 用户的身份与密码登录到 gitlab 界面中,并创建项目 Project

技术分享图片

6、指定项目的存储路径和项目名称

技术分享图片

把客户端的公钥添加到这里之后才会出现下图的内容

技术分享图片

7、为项目创建 Dev分支

注意:因为版本的原因,需要先在项目里面添加一个文件,才能显示下图中创建分支的操作

技术分享图片

技术分享图片

8、在 client 上添加 Tompson 的用户

[git@server ~]# useradd Tompson
[git@server ~]# useradd Hellen
[git@server ~]# useradd Eric
[git@server ~]# useradd test
[git@server ~]# su - Tompson
[Tompson@server ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/Tompson/.ssh/id_rsa): 
Created directory ‘/home/Tompson/.ssh‘.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/Tompson/.ssh/id_rsa.
Your public key has been saved in /home/Tompson/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:SAoAH2zSxqEJqVgKKrxM5XMi6tKe61JMRdwMhwBNIrE Tompson@domain.cn
The key‘s randomart image is:
+---[RSA 2048]----+
|XX==o=.          |
|*BOo+.o          |
|E*=.  .          |
|*+.= + .         |
|=oo = . S        |
|.oo              |
|.o               |
|o...             |
|.+=.             |
+----[SHA256]-----+
[Tompson@server ~]$ cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZ8cRGHej+sZzlmK36W5MUXMLOGdTwFI9Jj44mGuabZCrlYW4GDpL6ppezN+Sur0wHtnKonYJzm8ntqS0S0UHyaPPQPl9Mrs/6Z4VrXZ/4RlqHdWeSrmOwCBQld0l8HvrmP4TyGHrOreO8uZqimd/Z+OiMqnYRZzENX11Pti/Px5g1MtJcoCi9uLtF42QYrt1X/fzAyPU9C5/5ZUq4Jln3EF20bzcA52oAzZIl0jrhI0TeTeW6zYq+KxdHGshL+qG7+Ne+akPOe4Ma5BQjcMZ2dQ2kbGuozXmLT8RDcj9YRKceQsUdTI71lJpwrWKGn8Vhra0EaK3hgoTuvMYaGfOF Tompson@domain.cn

9、将 Tompson 的公钥复制到 gitlab 中

使用 Tompson 用户的身份与密码登录到 gitlab界面中,然后在 ssh-key 中添加相关的key
技术分享图片

技术分享图片

10、为 Tompson 用户配置 git

[Tompson@server ~]$ git config --global user.email "222@qq.com"
[Tompson@server ~]$ git config --global user.name "tom"

[Tompson@server ~]$ git clone git@192.168.60.119:plat-sp/chathall.git
Cloning into ‘chathall‘...
The authenticity of host ‘192.168.60.119 (192.168.60.119)‘ can‘t be established.
ECDSA key fingerprint is SHA256:CDxAQmj6gUkIxB6XUofbZ853GuPM5LS2QO4a5dD7jRo.
ECDSA key fingerprint is MD5:4e:20:72:a7:46:c6:d7:5d:bb:9d:ce:c3:f3:da:43:f9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.60.119‘ (ECDSA) to the list of known hosts.
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
[Tompson@server ~]$ 
[Tompson@server ~]$ cd chathall/
[Tompson@server chathall]$ ls
Readme.txt
[Tompson@server chathall]$

11、创建新文件,添加内容,并提交到 master 分支

[Tompson@server chathall]$ vim test.sh
[Tompson@server chathall]$ cat test.sh 
#!/bin/bash
echo "gitlab test"
[Tompson@server chathall]$ git add . 
[Tompson@server chathall]$ git commit -m ‘201805101649‘
[master 80edf6b] 201805101649
 1 file changed, 2 insertions(+)
 create mode 100644 test.sh
[Tompson@server chathall]$ 
[Tompson@server chathall]$ git push -u origin master 
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 305 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.60.119:plat-sp/chathall.git
   4611654..80edf6b  master -> master
Branch master set up to track remote branch master from origin.
[Tompson@server chathall]$ 

12、使用 Eric 用户登录,并 clone 项目

[git@server ~]# su - Eric
[Eric@server ~]$ ssh-keygen -C Eric@domain.cn
Generating public/private rsa key pair.
Enter file in which to save the key (/home/Eric/.ssh/id_rsa): 
Created directory ‘/home/Eric/.ssh‘.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/Eric/.ssh/id_rsa.
Your public key has been saved in /home/Eric/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:VZaJvjA5SJZEB+yuRpDBNHCECCZ5R8X0DYcNE0f1B6E Eric@domain.cn
The key‘s randomart image is:
+---[RSA 2048]----+
|*O=..B*o**+o+oo. |
|*.+.. *o.*oooo . |
| . + + ..oo E . .|
|  o   o =..    . |
|   . .  S+ .     |
|    . .   .      |
|   . .           |
|    o            |
|   .             |
+----[SHA256]-----+

[Eric@server ~]$ cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDxQcn4UjRW/5PT5witeV9+S2w8WK5ouawHxEF7s9wuWsT4pqhcu5BN74NG3CPaq1jJZnkV+aQsTw+60BAd1gOK0FBbKWxmohmE61n9vfpUT5igJ72t2jpXjfKwLIHw+Iq5yM4yUhkwSsoBuZkxYSEltnj8OvXaOlCDYnXuGBa9+xO8f5yVIcOtiwRvv+Y1PRRzSIcazPVZax9FLK26t1R4NPiY4xWkIJyK2OrKMeiaBBzyMfWzHdmsCWa51oSrYSmz3PDBXpzIBs3OdKxcaJs9Lc5u87YCV5RMUjLrPcA7nPK6crOabLXhz3d5GSYggMTOByQkyKOo7WlYpARCHOt/ Eric@domain.cn
[Eric@server ~]$ 

13、同样需要使用Eric用户登录gitlab web 界面,并添加相应的ssh-key。然后设置git ,并clone项目

[Eric@server ~]$ git config --global user.email "Eric@domain.cn"
[Eric@server ~]$ git config --global user.name "Eric"
[Eric@server ~]$ git clone git@192.168.60.119:plat-sp/chathall.git
Cloning into ‘chathall‘...
The authenticity of host ‘192.168.60.119 (192.168.60.119)‘ can‘t be established.
ECDSA key fingerprint is SHA256:CDxAQmj6gUkIxB6XUofbZ853GuPM5LS2QO4a5dD7jRo.
ECDSA key fingerprint is MD5:4e:20:72:a7:46:c6:d7:5d:bb:9d:ce:c3:f3:da:43:f9.
Are you sure you want to continue connecting (yes/no)? yes
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.
[Eric@server ~]$ 

14、切换到dev分支,修改文件内容,并将新 code 提交到 dev分支 (Developer角色默认并没有提交master的权限)

[Eric@server chathall]$ git checkout dev 
Branch dev set up to track remote branch dev from origin.
Switched to a new branch ‘dev‘
[Eric@server chathall]$ ls
Readme.txt  test.sh
[Eric@server chathall]$ vim eric.sh 
[Eric@server chathall]$ cat eric.sh
#!/bin/bash
echo "brahch test"
[Eric@server chathall]$ git add . 
[Eric@server chathall]$ git commit -m ‘201805101658‘
[dev 6687039] 201805101658
 1 file changed, 1 insertion(+)
[Eric@server chathall]$ git push -u origin dev 
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 306 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: 
remote: To create a merge request for dev, visit:
remote:   http://192.168.60.119/plat-sp/chathall/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote: 
To git@192.168.60.119:plat-sp/chathall.git
   80edf6b..6687039  dev -> dev
Branch dev set up to track remote branch dev from origin.
[Eric@server chathall]$
[Eric@server chathall]$ git checkout master 
Switched to branch ‘master‘
[Eric@server chathall]$ git branch 
  dev
* master
[Eric@server chathall]$

15、使用Eric 用户登录gitlab web,在界面中 创建一个合并请求

技术分享图片

提交合并请求:
技术分享图片

16、使用Tompson用户登录 gitlab web ,找到“合并请求” ,然后将dev分支合并到master分支

技术分享图片

技术分享图片

十、Gitlab 备份与恢复

1、查看系统版本和软件版本

[root@server gitlab]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 

[root@server gitlab]# cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
8.15.4

2、数据备份

1、查看备份相关的配置项

[root@server ~]# vim /etc/gitlab/gitlab.rb
gitlab_rails[‘manage_backup_path‘] = true
gitlab_rails[‘backup_path‘] = "/data/gitlab/backups"

该项定义了默认备份出文件的路径,可以通过修改该配置,并执行 gitlab-ctl reconfigure 或者 gitlab-ctl restart 重启服务生效。

2、执行备份命令进行备份

[root@server ~]# /opt/gitlab/bin/gitlab-rake gitlab:backup:create 

3、添加到 crontab 中定时执行

[root@server ~]# crontab -e
0 2 * * * bash /opt/gitlab/bin/gitlab-rake gitlab:backup:create

可以到/data/gitlab/backups找到备份包,解压查看,会发现备份的还是比较全面的,数据库、repositories、build、upload等分类还是比较清晰的。

4、设置备份保留时长

防止每天执行备份,有目录被爆满的风险,打开/etc/gitlab/gitlab.rb配置文件,找到如下配置:

[root@server ~]# vim /etc/gitlab/gitlab.rb
gitlab_rails[‘backup_keep_time‘] = 604800

设置备份保留7天(7360024=604800),秒为单位,如果想增大或减小,可以直接在该处配置,并通过gitlab-ctl restart 重启服务生效。

备份完成,会在备份目录中生成一个当天日期的tar包。

3、数据恢复

1、安装部署 gitlab server

具体步骤参见上面:gitlab server 搭建过程

2、恢复 gitlab

1、查看备份相关的配置项
[root@server ~]# vim /etc/gitlab/gitlab.rb
gitlab_rails[‘backup_path‘] = "/data/gitlab/backups"

修改该配置,定义了默认备份出文件的路径,并执行 gitlab-ctl reconfigure 或者 gitlab-ctl restart 重启服务生效。

2、恢复前需要先停掉数据连接服务
[root@server ~]# gitlab-ctl stop unicorn
[root@server ~]# gitlab-ctl stop sidekiq
  • 如果是台新搭建的主机,不需要操作,理论上不停这两个服务也可以。停这两个服务是为了保证数据一致性。
3、同步备份文件到新服务器

将老服务器/data/gitlab/backups目录下的备份文件拷贝到新服务器上的/data/gitlab/backups

[root@server gitlab]# rsync -avz 1530773117_2019_03_05_gitlab_backup.tar 192.168.95.135:/data/gitlab/backups/ 
  • 注意权限:600权限是无权恢复的。 实验环境可改成了777,生产环境建议修改属主属组
[root@server backups]# pwd
/data/gitlab/backups
[root@server backups]# chown -R git.git 1530773117_2019_03_05_gitlab_backup.tar 
[root@server backups]# ll
total 17328900
-rwxrwxrwx 1 git git 17744793600 Jul  5 14:47 1530773117_2018_07_05_gitlab_backup.tar
4、执行命令进行恢复

后面再输入两次 yes 就完成恢复了。

[root@server ~]# gitlab-rake gitlab:backup:restore BACKUP=1530773117_2018_07_05_gitlab_backup.tar
注意:backups 目录下保留一个备份文件可直接执行
5、恢复完成启动服务

恢复完成后,启动刚刚的两个服务,或者重启所有服务,再打开浏览器进行访问,发现数据和之前的一致:

[root@server ~]# gitlab-ctl start unicorn
[root@server ~]# gitlab-ctl start sidekiq
或
[root@server ~]# gitlab-ctl restart

注意:通过备份文件恢复gitlab必须保证两台主机的gitlab版本一致,否则会提示版本不匹配

分布式版本控制系统-Github

原文:https://www.cnblogs.com/pengpengboshi/p/13558907.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!