天天看點

Gerrit上分支操作記錄(建立分支、删除分支)

Git分支對于一個項目的代碼管理而言,是十分重要的!許多久用git的朋友可能已經掌握的很牢固了,但對于一些初涉git的童鞋來說,可能還不是很熟悉。

在此,我将自己的一些操作經曆做一梳理,希望能幫助到有用到的朋友們。

gerrit分支操作常用的指令可以參考:http://www.cnblogs.com/kevingrace/p/5690820.html

1)首先,利用gitlab進行建立分支

登陸gitlab,建立組test,在這個組上建立工程apptest,然後讓這個工程裡添加内容

注意:在添加内容的使用,我們可以自定義分支名,這個分支就是我們想要建立的分支

如下截圖:

Gerrit上分支操作記錄(建立分支、删除分支)
Gerrit上分支操作記錄(建立分支、删除分支)
Gerrit上分支操作記錄(建立分支、删除分支)

這樣,就建立了三個分支:master(預設),test,dev

特别注意:

後面建立的分支都是以前面目前分支為源建立的

是以新建立分支的檔案都會包括前面的分支的檔案,應該将和前面分支重複的檔案删除!

如:

master分支下是testfile檔案

test分支下是testfile檔案、123檔案,應該将testfile檔案删除

dev分支下是testfile檔案、123檔案、zhonghon檔案,應該将testfile檔案和zhonghon檔案删除

如下:

Gerrit上分支操作記錄(建立分支、删除分支)
Gerrit上分支操作記錄(建立分支、删除分支)
Gerrit上分支操作記錄(建立分支、删除分支)

在linux客戶機上操作分支,修改分支下的代碼并上傳到遠端的git分支上

[gerrit@115~]$  git clone [email protected]: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

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

[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 [email protected]:test/apptest.git

7a4b6e6..6eae416 dev -> dev

Branch dev set up to track remote branch dev from origin.

git push -u origin dev

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

Gerrit上分支操作記錄(建立分支、删除分支)

其他的分支如上面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 [email protected]: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工程已經建立了。

Gerrit上分支操作記錄(建立分支、删除分支)
Gerrit上分支操作記錄(建立分支、删除分支)

接着修改非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上分支操作記錄(建立分支、删除分支)
Gerrit上分支操作記錄(建立分支、删除分支)
Gerrit上分支操作記錄(建立分支、删除分支)
Gerrit上分支操作記錄(建立分支、删除分支)

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指針是一緻的

Gerrit上分支操作記錄(建立分支、删除分支)

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

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

Gerrit上分支操作記錄(建立分支、删除分支)

[gerrit@115~ ]$ git clone ssh://[email protected]:29418/apptest && scp -p -P 29418 [email protected]: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/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/master 486e140 Merge "123"

千萬記住一點::

新分支建立後,是和建立時的目前所在分支下的内容是一緻的。

切換到建立分之以後,如果不清空目前内容,直接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.

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://[email protected]:29418/apptest

486e140..3a26276 ops -> ops

這時候再檢視分支情況,就會發現ops分支和master分支的ID不一樣了

[gerrit@Zabbix-server apptest]$ git branch -av

* ops 3a26276 222

remotes/origin/ops 3a26276 222

再次登入gerrit界面,就會發現Revision自然也就不一緻了,ops分支下的内容和master分支下的内容也不一樣了

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

Gerrit上分支操作記錄(建立分支、删除分支)

接着就可以往ops分支裡建立或修改代碼了,如下:

[root@115~ ]# su - wangshibo                 #切換到gerrit普通使用者wangshibo賬号下操作

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

[wangshibo@115~ ]$ cd apptest/

[wangshibo@115~ ]$ git branch -av              #檢視分支,目前分支是master

* master 486e140 Merge "123"

[wangshibo@115~ ]$ git checkout -b ops remotes/origin/ops          #将遠端分支本地别名化

[wangshibo@115~ ]$ git branch -av              #發現目前分支已經是ops了

[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://[email protected]: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

To ssh://[email protected]:29418/apptest.git

* [new branch] HEAD -> refs/publish/ops

登陸gerrit,就會發現有個review的稽核請求了

Gerrit上分支操作記錄(建立分支、删除分支)

通過稽核

Gerrit上分支操作記錄(建立分支、删除分支)
Gerrit上分支操作記錄(建立分支、删除分支)
Gerrit上分支操作記錄(建立分支、删除分支)

這個時候,review稽核已經通過了

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

Gerrit上分支操作記錄(建立分支、删除分支)
Gerrit上分支操作記錄(建立分支、删除分支)
Gerrit上分支操作記錄(建立分支、删除分支)

最後,登陸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

To ssh://[email protected]:29418/GItLearn

- [deleted] remotes/origin/devlop

[wangshibo@115 GItLearn]$ git branch -av #再次檢視,上面多餘的分支已經删除了!

devlop dc21d7f 123

* master 44f4b3a Add new file

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分支。(上面已經提到了!)

如下面的例子:

本地建立分支devlop,然後上傳到gerrit上:

[wangshibo@115 GItLearn]$ git branch devlop                #建立devlop分支

devlop 44f4b3a Add new file

[wangshibo@115 GItLearn]$ git push origin devlop:devlop       #上傳到遠端gerrit上,gerrit上若沒有devlop,則會自動建立

Total 0 (delta 0), reused 0 (delta 0)

To ssh://[email protected]:29418/GItLearn

* [new branch] devlop -> devlop

[wangshibo@115 GItLearn]$ git branch -av         #再次檢視,發現已經上傳到遠端gerrit上了

remotes/origin/devlop 44f4b3a Add new file

登陸gerrit檢視,發現已經有了這個分支了!【這樣上傳後,分支内容和master分支内容是一樣的,因為在本地建立devlop分支的時候,目前分支是master】

Gerrit上分支操作記錄(建立分支、删除分支)

将遠端gerrit上的代碼分支遷移到本地新的gerrit分支上

遷移流程:

1.先将遠端gerrit整個代碼clone到本地(預設遷移過來後的目前分支是master)

2.clone到本地後,檢視分支清單

3.在本地gerrit上建立同名分支

4.切換到clone下來的代碼的各個分支,然後将分支内容push到本地新gerrit上的同名分支上

*******

把本地倉庫送出到遠端倉庫的master分支中(其他分支操作一樣)

git push ssh://[email protected]:29418/apptest_ios.git master #或者像上面一樣,将遠端分支本地化,然後一步步送出

*************** 當你發現自己的才華撐不起野心時,就請安靜下來學習吧!***************