gitlab分支保護

尹正杰發表於2024-11-30

                                              作者:尹正傑

版權宣告:原創作品,謝絕轉載!否則將追究法律責任。

目錄
  • 1.開發者無法推送程式碼到master分支案例
    • 1.1 檢視jasonyin2020角色
    • 1.2 檢視jasonyin2020有許可權的相關專案
    • 1.3 使用jasonyin2020使用者拉取meta-data專案所有分支到本地
    • 1.4 使用jasonyin2020使用者推送資料到dev分支
    • 1.5 使用jasonyin2020使用者推送資料到master分支會失敗(gitlab預設的保護分支)
  • 2.使用管理員檢視gitlab專案的預設分支保護
    • 2.1 檢視群組資訊
    • 2.2 檢視dev組的meta-data專案
    • 2.3 檢視預設的分支保護
  • 3.解決分支保護的思路
  • 4.jasonyin2020使用者發起合併程式碼請求
    • 4.1 jasonyin2020使用者建立合併請求
    • 4.2 jasonyin2020使用者建立合併請求成功
    • 4.3 專案管理員root檢視合併請求
    • 4.4 專案管理員root批准合併請求
  • 5.jasonyin2020開發的程式碼成功合併

1.開發者無法推送程式碼到master分支案例

1.1 檢視jasonyin2020角色

如上圖所示,jasonyin2020使用者的角色是開發者(Developer)。

與此同時,jasonyin2020使用者屬於dev組喲。

1.2 檢視jasonyin2020有許可權的相關專案

如上圖所示,jasonyin2020使用者對dev組的meta-data專案有許可權喲。

1.3 使用jasonyin2020使用者拉取meta-data專案所有分支到本地

	(1)使用jasonyin2020使用者拉取meta-data專案的master分支
[root@ubuntu11.yinzhengjie.com ~]# cd /tmp/
[root@ubuntu11.yinzhengjie.com tmp]# 
[root@ubuntu11.yinzhengjie.com tmp]# git clone http://gitlab11.yinzhengjie.com/dev/meta-data.git
Cloning into 'meta-data'...
Username for 'http://gitlab11.yinzhengjie.com': jasonyin2020
Password for 'http://jasonyin2020@gitlab11.yinzhengjie.com': 
remote: Enumerating objects: 24, done.
remote: Counting objects: 100% (24/24), done.
remote: Compressing objects: 100% (18/18), done.
remote: Total 24 (delta 4), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (24/24), done.
Resolving deltas: 100% (4/4), done.
[root@ubuntu11.yinzhengjie.com tmp]# 
[root@ubuntu11.yinzhengjie.com tmp]# cd meta-data/
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# git branch
* master
[root@ubuntu11.yinzhengjie.com meta-data]# 



	(2)使用jasonyin2020使用者拉取meta-data專案的dev分支
[root@ubuntu11.yinzhengjie.com meta-data]# cat index.html   # 拉取資料前,先檢視首頁檔案內容。
<h1>專案成立</h1>
<h1>VR功能</h1>
<h1>VIP功能</h1>
<h1>修復Bug成功</h1>
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# git checkout -b dev
Switched to a new branch 'dev'
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# git branch
* dev
  master
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# git remote -v
origin	http://gitlab11.yinzhengjie.com/dev/meta-data.git (fetch)
origin	http://gitlab11.yinzhengjie.com/dev/meta-data.git (push)
[root@ubuntu11.yinzhengjie.com meta-data]# 

[root@ubuntu11.yinzhengjie.com meta-data]# git pull origin dev
Username for 'http://gitlab11.yinzhengjie.com': jasonyin2020
Password for 'http://jasonyin2020@gitlab11.yinzhengjie.com': 
From http://gitlab11.yinzhengjie.com/dev/meta-data
 * branch            dev        -> FETCH_HEAD
Updating 37f7b35..19587c5
Fast-forward
 .gitignore | 9 +++++++++
 index.html | 4 ++++
 2 files changed, 13 insertions(+)
 create mode 100644 .gitignore
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# cat index.html 
<h1>專案成立</h1>
<h1>VR功能</h1>
<h1>VIP功能</h1>
<h1>修復Bug成功</h1>
<h1>真人秀</h1>
<h1>點贊,互動</h1>
<h1>美顏,濾鏡</h1>
<h1>開直播,下播</h1>
[root@ubuntu11.yinzhengjie.com meta-data]# 


1.4 使用jasonyin2020使用者推送資料到dev分支

	(1)修改資料
[root@ubuntu11.yinzhengjie.com meta-data]# cat index.html 
<h1>專案成立</h1>
<h1>VR功能</h1>
<h1>VIP功能</h1>
<h1>修復Bug成功</h1>
<h1>真人秀</h1>
<h1>點贊,互動</h1>
<h1>美顏,濾鏡</h1>
<h1>開直播,下播</h1>
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# echo "<h1>電商平臺</h1>"  >> index.html 
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# cat index.html 
<h1>專案成立</h1>
<h1>VR功能</h1>
<h1>VIP功能</h1>
<h1>修復Bug成功</h1>
<h1>真人秀</h1>
<h1>點贊,互動</h1>
<h1>美顏,濾鏡</h1>
<h1>開直播,下播</h1>
<h1>電商平臺</h1>
[root@ubuntu11.yinzhengjie.com meta-data]# 


	(2)提交資料到本地倉庫
[root@ubuntu11.yinzhengjie.com meta-data]# git add .; git commit -m '電商'
[dev 99222c1] 電商
 1 file changed, 1 insertion(+)
[root@ubuntu11.yinzhengjie.com meta-data]# 

	
	(3)推送程式碼到遠端倉庫
[root@ubuntu11.yinzhengjie.com meta-data]# git push origin dev
Username for 'http://gitlab11.yinzhengjie.com': jasonyin2020
Password for 'http://jasonyin2020@gitlab11.yinzhengjie.com': 
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 2 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 332 bytes | 332.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: 
remote: To create a merge request for dev, visit:
remote:   http://gitlab11.yinzhengjie.com/dev/meta-data/-/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote: 
To http://gitlab11.yinzhengjie.com/dev/meta-data.git
   19587c5..99222c1  dev -> dev
[root@ubuntu11.yinzhengjie.com meta-data]# 

1.5 使用jasonyin2020使用者推送資料到master分支會失敗(gitlab預設的保護分支)

	(1)修改資料並提交程式碼到本地倉庫
[root@ubuntu11.yinzhengjie.com meta-data]# git branch
* dev
  master
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# git branch
  dev
* master
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# cat index.html 
<h1>專案成立</h1>
<h1>VR功能</h1>
<h1>VIP功能</h1>
<h1>修復Bug成功</h1>
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# echo "<h1>抖+投流...</h1>" >> index.html 
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# cat index.html 
<h1>專案成立</h1>
<h1>VR功能</h1>
<h1>VIP功能</h1>
<h1>修復Bug成功</h1>
<h1>抖+投流...</h1>
[root@ubuntu11.yinzhengjie.com meta-data]# 
[root@ubuntu11.yinzhengjie.com meta-data]# git add .; git commit -m '抖加'
[master 3c59b67] 抖加
 1 file changed, 1 insertion(+)
[root@ubuntu11.yinzhengjie.com meta-data]# 


	(2)使用jasonyin2020使用者推送程式碼到master失敗,因為該分支被保護啦~
[root@ubuntu11.yinzhengjie.com meta-data]# git push origin master
Username for 'http://gitlab11.yinzhengjie.com': jasonyin2020
Password for 'http://jasonyin2020@gitlab11.yinzhengjie.com': 
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 295 bytes | 295.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: GitLab: You are not allowed to push code to protected branches on this project.
To http://gitlab11.yinzhengjie.com/dev/meta-data.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'http://gitlab11.yinzhengjie.com/dev/meta-data.git'
[root@ubuntu11.yinzhengjie.com meta-data]# 

2.使用管理員檢視gitlab專案的預設分支保護

2.1 檢視群組資訊

如上圖所示,使用管理員root使用者登入,檢視dev組的專案。

2.2 檢視dev組的meta-data專案

如上圖所示,檢視dev組的meta-data專案。

溫馨提示,不一定必須使用root使用者登入,凡是對dev組的meta-date擁有Owner許可權的使用者均可喲~

2.3 檢視預設的分支保護

如上圖所示,依次點選後,就可以檢視到"受保護的分支",點選"展開"按鈕,就可以看到如下圖所示的圖片。

很明顯,master分支屬於預設的分支保護,即預設情況下只有Maintainer及以上的角色許可權才能進行程式碼的合併和推送喲~

3.解決分支保護的思路

思路一:
	取消分支保護,這樣任意有許可權訪問專案的使用者均可以合併程式碼和推送程式碼。
	
	優勢:
		所有使用者都能推送程式碼,開發人員操作起來比較方便。
		
	缺點:
		正式因為所有人都能推送程式碼到master分支,很可能某個開發寫的程式未經過充分測試而在執行過程中差生bug,導致程式崩潰的現象。
		
		
思路二:
	使用預設的分支保護。
	優勢:
		只有部分擁有相應角色的使用者才能推送或合併程式碼到master分支。起到了一定的分支保護的作用。限制了大部分使用者的行為。
	缺點:
		需要運維或開發人員手動合併程式碼。

4.jasonyin2020使用者發起合併程式碼請求

4.1 jasonyin2020使用者建立合併請求

如上圖所示,我們可以發起"建立合併請求"。並按照下圖的方式進行提交即可。

4.2 jasonyin2020使用者建立合併請求成功

如上圖所示,成功建立了合併請求啦。重新重新整理頁面可以看到如下圖所示的資訊。

4.3 專案管理員root檢視合併請求

如上圖所示,使用meta-data管理員進行登入並檢視該專案,效果如下圖所示。

4.4 專案管理員root批准合併請求

如上圖所示,檢視到jasonyin2020使用者發起的合併請求,如下圖所示,點選"批准",和"合併"

5.jasonyin2020開發的程式碼成功合併

如上圖所示,程式碼和合併成功啦。

如下圖所示,程式碼合併成功發現dev分支也被刪除啦!

相關文章