Gerrit上分支操做記錄(建立分支、刪除分支)

 

Git分支對於一個項目的代碼管理而言,是十分重要的!許多久用git的朋友可能已經掌握的很牢固了,但對於一些初涉git的童鞋來講,可能還不是很熟悉。
在此,我將本身的一些操做經歷作一梳理,但願能幫助到有用到的朋友們。html

gerrit分支操做經常使用的命令能夠參考:http://www.cnblogs.com/kevingrace/p/5690820.htmllinux

1)首先,利用gitlab進行建立分支
登錄gitlab,建立組test,在這個組上建立工程apptest,而後讓這個工程裏添加內容
注意:在添加內容的使用,咱們能夠自定義分支名,這個分支就是咱們想要建立的分支
以下截圖:ios

 

這樣,就建立了三個分支:master(默認),test,devgit

特別注意:web

後面建立的分支都是之前面當前分支爲源建立的vim

因此新建立分支的文件都會包括前面的分支的文件,應該將和前面分支重複的文件刪除!bash

如:服務器

master分支下是testfile文件app

test分支下是testfile文件、123文件,應該將testfile文件刪除ssh

dev分支下是testfile文件、123文件、zhonghon文件,應該將testfile文件和zhonghon文件刪除

 

以下:

 

在linux客戶機上操做分支,修改分支下的代碼並上傳到遠程的git分支上

[gerrit@115~]$  git clone git@103.10.86.30:test/apptest.git

[gerrit@115~]$ git branch -av         #查看當前分支狀況,發現了上面在gitlab裏面建立的三個分組master,dev,test

* master 1c2ecde 12                       #發現當前在master分支下(*指向master)
remotes/origin/HEAD -> origin/master
remotes/origin/dev 6eae416 234
remotes/origin/master 1c2ecde 12
remotes/origin/test d5b51b9 Delete zhonghogn

[gerrit@115~]$ vim .gitrevirw

[gerrit@115~]$ vim .testr.conf

[gerrit@115~]$ git add .

[gerrit@115~]$ git commit -m 「add on master"

[gerrit@115~]$ git push -u origin master          #提交到master分支下,查看gitlab上apptest工程下的master分支,已經有這兩個文件

 

接着選擇一個非master的分支,如dev分支,修改裏面的代碼

[gerrit@115~]$ git branch dev remotes/origin/dev      #先將遠程gitlab上建立的分支在本地別名化

[gerrit@115~]$ git checkout dev         #使用git checkout命令切換到dev分支下
Switched to branch 'dev'
[gerrit@115~]$ git branch -av        #查看當前分支,發現本地有了dev分支了(上面設置過的分支別名)
* dev 6eae416 234
master 1c2ecde 12
remotes/origin/HEAD -> origin/master
remotes/origin/dev 6eae416 234
remotes/origin/master 1c2ecde 12
remotes/origin/test d5b51b9 Delete zhonghogn

[gerrit@115~]$ vim .gitrevirw            #修改dev分支下的代碼  

[gerrit@115~]$ vim .testr.conf

[gerrit@115~]$ git add .

[gerrit@115~]$ git commit -m 「add on dev"

[gerrit@115~]$ git push -u origin dev             #注意,這裏提交到dev分支下
Counting objects: 5, done.
Delta compression using up to 32 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 535 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
To git@103.10.86.30:test/apptest.git
7a4b6e6..6eae416 dev -> dev
Branch dev set up to track remote branch dev from origin.

git push -u origin dev
Counting objects: 5, done.
Delta compression using up to 32 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 535 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
To git@103.10.86.30:test/apptest.git
7a4b6e6..6eae416 dev -> dev
Branch dev set up to track remote branch dev from origin.

這樣就能push到遠程的remotes/origin/dev 上了,去gitlab上看看dev分支下已經有了這兩個文件.gitreview和.testr.conf

以下:

 

其餘的分支如上面gitlab裏的test分支,要想弄到本地,操做和上面的dev分支操做同樣

*******************************************************

 

線上部署了gerrit+gitlab環境(代碼同步),將git代碼放到上面進行維護管理了!

應開發同事要求,要在他們的項目下建立除master默認分支以外的其餘分支

在gerrit上建立分支,這裏我總結了下面兩種狀況的操做,在此作一詳細記錄:

 (1)

第一種狀況:gerrit上尚未建立項目

《gerrit上的項目最好是從gitlab上git clone --bare過來,而且項目不要爲空》

思路:

先在gitlab上建立分支(上面截圖),而後在linux服務器(這裏選擇gerrit本機)git clone下載gitlab裏的項目(如上面的apptest)

最後將整個項目發佈到gerrit上

關於怎麼在gerrit上設置項目,你們可參考個人另外一片博客,裏面有詳細介紹(http://www.cnblogs.com/kevingrace/p/5651447.html

《注意,上面在新分支下添加的.gitreview文件必定要有,否則就不能使用git review命令提交代碼審覈了,具體上面參考的另外一篇博客中有說明》

在gerrit的一個普通用戶如wangshibo下操做:

若是修改apptest項目的非master分支下的代碼,如上面的dev分支

用 gerrit用戶在 Gerrit 上建立 test-project1 項目
要知道 review 是在 gerrit 上,而 gerrit 上如今是沒有項目的,想讓 gitlab 上的項目能在 gerrit 上 review 的話,必須在 gerrit 上建立相同的項目,並有相同的倉庫文件.

用 gerrit用戶在 Gerrit 上建立 apptest 項目
[gerrit@115]$ ssh-gerrit gerrit create-project apptest      #這時候gerrit上其實已經有apptest項目了
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
ssh-gerrit是別名
[gerrit@115r ~]$ cat ~/.bashrc
# .bashrc

 

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
alias ssh-gerrit='ssh -p 29418 -i ~/.ssh/id_rsa 103.10.86.30 -l gerrit'
# User specific aliases and functions
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

雖然上面建立了apptest項目,而且gerrit界面裏已經有這個項目,可是個空目錄
咱們須要將Gitlab上的apptest項目發佈到gerrit上
在此須要用到git clone –bare 命令
[gerrit@115]$ cd /home/gerrit/gerrit_site/git/        #即登錄到gerrit安裝目錄的git下
[gerrit@115 git]$ rm -fr apptest.git
[gerrit@115 git]$ git clone --bare git@103.10.86.30:test/apptest.git
[gerrit@115 git]$ ls
All-Projects.git All-Users.git apptest.git
[gerrit@115 git]$ cd apptest.git/
[gerrit@115 git]$ ls              #即test-project1工程和gerrit裏默認的All-Projects.git工程結構是同樣的了
branches config description HEAD hooks info objects packed-refs refs


登錄gerrit界面,發現apptest工程已經建立了。

 

 

接着修改非master分支,好比dev分支的代碼並提交到gerrit裏審覈

[root@115~]# su - wangshibo    #切換到gerrit的用戶用戶wangshibo下

[wangshibo@115~]$ git branch -av            #查看本地的分支結構

* master 1c2ecde 12
remotes/origin/HEAD -> origin/master
remotes/origin/dev 6eae416 234
remotes/origin/master 1c2ecde 12
remotes/origin/test d0ef218 444

[wangshibo@115~]$ git branch dev remotes/origin/dev    將遠程分支本地別名化

[wangshibo@115~]$ git checkout dev           # 切換到dev分支下

[wangshibo@115~]$ vim haha

[wangshibo@115~]$git add haha

[wangshibo@115~]$git commit -m "23232323"

[wangshibo@115~]$git review dev             #提交代碼審覈的時候,注意要指定提交到分支dev上審覈

而後用wangshibo用戶登陸gerrit,進行審覈

審覈經過後,經過apptest的dev分支的gitweb就能查看到提交的代碼,以下:

 

 

 

 

Gerrit裏面分支代碼審覈經過後,會自動同步到Gitlab上相應工程的分支下的

也就是說:Gerrit到Gitlab的同步策略包含全部的分支!

 

***************************************************************************

第二種狀況:gerrit上已經建立好了項目,後續建立分支並插入到gerrit的項目裏:

【gerrit上對應項目的access的refs/heads/*的「push」權限能夠運行推送代碼和分支到gerrit上;「Create Reference」權限運行建立分支;】

首先在gerrit界面建立分支(這裏新建立分支ops),以下:

管理員賬號登錄gerrit,點擊apptest項目的Branches->Create Branch  (默認的initial Revision是HEAD)

剛建立後,會發現新分支和mater分支的Revision一致,HEAD指針是一致的

 

接着在本地git clone把代碼從新克隆下來,

好比上面在gerrit裏已經建立好了apptest項目,將這個項目clone到本地

 

 

[gerrit@115~ ]$ git clone ssh://gerrit@103.10.86.30:29418/apptest && scp -p -P 29418 gerrit@103.10.86.30:hooks/commit-msg apptest/.git/hooks/

[gerrit@115~ ]$ cd apptest

[gerrit@115~ apptest]$ git branch -av         #查看分支狀況,已經能夠發現gerrit界面裏建立的新分支ops
* master 486e140 Merge "123"         #當前在master分支下
remotes/origin/HEAD -> origin/master
remotes/origin/dev 27a1d5c 343434
remotes/origin/master 486e140 Merge "123"     #新分支剛建立時,跟當前所在分支的ID是一致的
remotes/origin/ops 486e140 Merge "123"
remotes/origin/test d0ef218 444

[gerrit@115~ apptest]$ git checkout -b ops remotes/origin/ops     #將新建分支在本地別名化,並切換進去
Branch ops set up to track remote branch ops from origin.
Switched to a new branch 'ops'
[gerrit@115~ apptest]$ git branch -av      再查看,發現當前分支就是ops了
master 486e140 Merge "123"
* ops 486e140 Merge "123"
remotes/origin/HEAD -> origin/master
remotes/origin/dev 27a1d5c 343434
remotes/origin/master 486e140 Merge "123"
remotes/origin/ops 486e140 Merge "123"
remotes/origin/test d0ef218 444

千萬記住一點::

新分支建立後,是和建立時的當前所在分支下的內容是一致的。

切換到新建分之之後,若是不清空當前內容,直接push上去,那該分支代碼和你切換以前的分支是同樣的。

因此要刪除新分支裏的內容,而後再push提交,提交後查看分支狀況,就會發現新建分支和以前的分支的 Revision指向就不同了,以下:

[gerrit@115~apptest]$ rm -rf ./*
[gerrit@115~ apptest]$ git add .
[gerrit@115~ apptest]$ git commit -am "222"    #由於前面是直接rm刪除的,因此這裏commit要多加一個-a,若是是git rm刪除就不用加-a
[ops 3a26276] 222
2 files changed, 0 insertions(+), 2 deletions(-)
delete mode 100644 haha
delete mode 100644 zhonghogn
[gerrit@Zabbix-server apptest]$ git push -u origin ops       #這裏是gerrit管理員下,因此能夠直接push,普通用戶就git review ops了
Counting objects: 3, done.
Delta compression using up to 32 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 246 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1)
remote: Processing changes: refs: 1, done
To ssh://gerrit@103.10.86.30:29418/apptest
486e140..3a26276 ops -> ops
Branch ops set up to track remote branch ops from origin.

 

這時候再查看分支狀況,就會發現ops分支和master分支的ID不同了

[gerrit@Zabbix-server apptest]$ git branch -av
master 486e140 Merge "123"
* ops 3a26276 222
remotes/origin/HEAD -> origin/master
remotes/origin/dev 27a1d5c 343434
remotes/origin/master 486e140 Merge "123"
remotes/origin/ops 3a26276 222
remotes/origin/test d0ef218 444

再次登陸gerrit界面,就會發現Revision天然也就不一致了,ops分支下的內容和master分支下的內容也不同了

 ops分支下這個時候仍是空的(上面已經清空了)

 

接着就能夠往ops分支裏建立或修改代碼了,以下:

[root@115~ ]# su - wangshibo                 #切換到gerrit普通用戶wangshibo帳號下操做
[wangshibo@115~ ]$ git clone ssh://gerrit@103.10.86.30:29418/apptest && scp -p -P 29418 gerrit@103.10.86.30:hooks/commit-msg apptest/.git/hooks/
[wangshibo@115~ ]$ cd apptest/
[wangshibo@115~ ]$ git branch -av              #查看分支,當前分支是master
* master 486e140 Merge "123"
remotes/origin/HEAD -> origin/master
remotes/origin/dev 27a1d5c 343434
remotes/origin/master 486e140 Merge "123"
remotes/origin/ops 3a26276 222
remotes/origin/test d0ef218 444
[wangshibo@115~ ]$ git checkout -b ops remotes/origin/ops          #將遠程分支本地別名化
Branch ops set up to track remote branch ops from origin.
Switched to a new branch 'ops'
[wangshibo@115~ ]$ git branch -av              #發現當前分支已是ops了
master 486e140 Merge "123"
* ops 3a26276 222
remotes/origin/HEAD -> origin/master
remotes/origin/dev 27a1d5c 343434
remotes/origin/master 486e140 Merge "123"
remotes/origin/ops 3a26276 222
remotes/origin/test d0ef218 444
[wangshibo@115~ ]$ ls                                 #沒有內容,上面已經提到,切換後就講內容清空了
[wangshibo@115~ ]$ vim testfile                   #新增內容
[wangshibo@115~ ]$ git add testfile
[wangshibo@115~ ]$ git commit -m "branch test"
[ops ba9572e] branch test
1 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 testfile
[wangshibo@115~ ]$ git review ops                #提交代碼審覈,提交是指定到分支ops裏
Creating a git remote called "gerrit" that maps to:
ssh://wangshibo@103.10.86.30:29418/apptest.git
remote: Processing changes: new: 1, refs: 1, done
remote:
remote: New Changes:
remote: http://103.10.86.30:80/64 branch test
remote:
To ssh://wangshibo@103.10.86.30:29418/apptest.git
* [new branch] HEAD -> refs/publish/ops

 

登錄gerrit,就會發現有個review的審覈請求了

 

經過審覈

 

 

 

這個時候,review審覈已經經過了

經過apptest項目的ops分支的gitweb就能看到新增的代碼了

 

 

 

最後,登錄Gitlab,就能發現相應項目的分支代碼也都同步過來了(前提是gerrit裏面作了相應的replication同步配置)!很神奇的~~~~~

 

*********************************************************************** ************** ********* 

如何刪除gerrit界面上建立的分支?也能夠理解在本地如何刪除遠程分支:

 

git 刪除遠程分支
一不當心把本地的臨時分支push誤提交到server上去了,想要刪除。
[wangshibo@115 ~]$ git branch -av
master
remote/origin/master
remote/origin/origin/master     #這個就是誤提交的分支

 

這個時候,執行下面命令便可刪除遠程分支
[wangshibo@115 ~]$git push origin :origin/master

 

冒號前面的空格不能少,原理是把一個空分支push到server上,至關於刪除該分支。其實也是一個push推送過程,只不過是推送的空的而已!

 

好比下面一例,在本地誤提交了一個分支到遠程的gerrit上了!如今須要刪除。

[wangshibo@115 GItLearn]$ git branch -av
* master 44f4b3a Add new file
remotes/origin/HEAD -> origin/master
remotes/origin/dev 44f4b3a Add new file
remotes/origin/master 44f4b3a Add new file
remotes/origin/remotes/origin/devlop dc21d7f 123          #刪除這個多餘的分支

 

[wangshibo@115 GItLearn]$ git push origin :remotes/origin/devlop
remote: Processing changes: refs: 1, done
To ssh://wangshibo@103.11.186.130:29418/GItLearn
- [deleted] remotes/origin/devlop
[wangshibo@115 GItLearn]$ git branch -av #再次查看,上面多餘的分支已經刪除了!
devlop dc21d7f 123
* master 44f4b3a Add new file
remotes/origin/HEAD -> origin/master
remotes/origin/dev 44f4b3a Add new file
remotes/origin/master 44f4b3a Add new file

 

再次登錄gerrit查看,上面多餘的分支就沒有了!

************************************************************************************************

如何在本地建立分支,而後上傳到gerrit上?也能夠理解爲在本地建立分支,而後推送到遠程新分支上:

命令格式以下:
#git push origin local_branch:remote_branch

注意:
這個操做,local_branch必須爲你本地存在的分支,remote_branch爲遠程分支,若是remote_branch不存在則會自動建立分支。

只不過這個上傳到遠程後,分支內容是和master分支內容是同樣的!

另外:
#git push origin :remote_branch
上面的local_branch留空(即冒號前面留有空格),則是刪除遠程remote_branch分支。(上面已經提到了!)

 

以下面的例子:
[wangshibo@115 GItLearn]$ git branch -av
* master 44f4b3a Add new file
remotes/origin/HEAD -> origin/master
remotes/origin/dev 44f4b3a Add new file
remotes/origin/master 44f4b3a Add new file


本地建立分支devlop,而後上傳到gerrit上:
[wangshibo@115 GItLearn]$ git branch devlop                #新建devlop分支
[wangshibo@115 GItLearn]$ git branch -av
devlop 44f4b3a Add new file
* master 44f4b3a Add new file
remotes/origin/HEAD -> origin/master
remotes/origin/dev 44f4b3a Add new file
remotes/origin/master 44f4b3a Add new file
[wangshibo@115 GItLearn]$ git push origin devlop:devlop       #上傳到遠程gerrit上,gerrit上若沒有devlop,則會自動建立
Total 0 (delta 0), reused 0 (delta 0)
remote: Processing changes: refs: 1, done
To ssh://wangshibo@103.10.86.30:29418/GItLearn
* [new branch] devlop -> devlop
[wangshibo@115 GItLearn]$ git branch -av         #再次查看,發現已經上傳到遠程gerrit上了
devlop 44f4b3a Add new file
* master 44f4b3a Add new file
remotes/origin/HEAD -> origin/master
remotes/origin/dev 44f4b3a Add new file
remotes/origin/devlop 44f4b3a Add new file
remotes/origin/master 44f4b3a Add new file

 

登錄gerrit查看,發現已經有了這個分支了!【這樣上傳後,分支內容和master分支內容是同樣的,由於在本地建立devlop分支的時候,當前分支是master】

 

************************************************************************************************

將遠程gerrit上的代碼分支遷移到本地新的gerrit分支上
遷移流程:
1.先將遠程gerrit整個代碼clone到本地(默認遷移過來後的當前分支是master)
2.clone到本地後,查看分支列表
3.在本地gerrit上建立同名分支
4.切換到clone下來的代碼的各個分支,而後將分支內容push到本地新gerrit上的同名分支上

*******把本地倉庫提交到遠程倉庫的master分支中(其餘分支操做同樣)git push ssh://gerrit@103.10.86.30:29418/apptest_ios.git master #或者像上面同樣,將遠程分支本地化,而後一步步提交

相關文章
相關標籤/搜索