分布式版本控制系統-Github


一、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版本一致,否則會提示版本不匹配


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM