gerrit使用總結

gerrit使用總結

分類: 版本管理 2050人閱讀 評論(0) 收藏 舉報
gerrit還是輕易不要嘗試引入,它的權限管理,真是複雜極了。對於小型團隊,初期這將是個噩夢,但是對於像OpenStack,安卓這種大型team,又是一把利器。

下面嘗試測試了兩個用戶的簡單情況,很多配置都是系統默認,沒有進行啥複雜配置,即使這樣也是錯誤百出,光一個commit就要折騰半天,而且還有些機制沒搞清楚。

首先要做的準備工作就是準備兩個gerrit用戶,user1和user2,並且分別把user1和user2的ssh pub-key通過gerrit setting添加好。

1. 首先user1創建一個叫HelloWord的project。

   如何創建project請參考前期博客或者官方文檔。

2. user1在自己的工作環境中把HelloWord clone下來

[user1@jenkins ~]$ git clone ssh://[email protected]:29418/HelloWorld.git
Initialized empty Git repository in /home/user1/HelloWorld/.git/
remote: Counting objects: 2, done
remote: Finding sources: 100% (2/2)
remote: Total 2 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (2/2), done.
加入user1沒有添加ssh pubkey的話,這一步會出permission deny

clone後,創建一個README文件並add,commit
[user1@jenkins ~]$ cd HelloWorld
[user1@jenkins HelloWorld]$ ls
[user1@jenkins HelloWorld]$ touch README
[penxiao@jenkins test]$ git add README 
[penxiao@jenkins test]$ git commit -m add README
這裏注意一點,在下面要push之前,一定要配置好git config的 username和email
可以通過命令行或者直接編輯 ~/.gitconfig文件實現,而且email一定要和gerrit裏註冊的email一致,否者push也會出錯。
[user1@jenkins HelloWorld]$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 213 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Processing changes: refs: 1, done    
To ssh://[email protected]:29418/HelloWorld.git
 * [new branch]      master -> master
[user1@jenkins HelloWorld]$

在gerrit的gitweb鏈接可以查看push的文件。

3. user2加入

[user2@jenkins ~]$ git clone ssh://[email protected]:29418/HelloWorld.git
Initialized empty Git repository in /home/user2/HelloWorld/.git/
remote: Counting objects: 3, done
remote: Finding sources: 100% (3/3)
remote: Total 3 (delta 0), reused 3 (delta 0)
Receiving objects: 100% (3/3), done.
[user2@jenkins ~]$ cd HelloWorld
[user2@jenkins HelloWorld]$ ls
README
[user2@jenkins HelloWorld]$ 

user2對README文件進行修改,然後要commit,push
!!!也同樣注意,user2的git config,username和email的配置,email要和gerrit setting裏的一致。

commit完以後可以看到

[user2@jenkins HelloWorld]$ git log
commit 7959fe47bc2d2f53539a1861aa6b0d71afe0a531
Author: user2 <[email protected]>
Date:   Thu Dec 12 00:24:53 2013 -0500

    edit README

commit 98099fc0de3ba889b18cf36f9a5af267b3ddb501
Author: user1 <[email protected]>
Date:   Thu Dec 12 00:15:08 2013 -0500

    add README
[user2@jenkins HelloWorld]$

現在user2要把這次的改變push到gerrit,可以麼?
不行的,可以看到
[user2@jenkins HelloWorld]$ git push origin master
Counting objects: 5, done.
Writing objects: 100% (3/3), 249 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Branch refs/heads/master:
remote: You are not allowed to perform this operation.
remote: To push into this reference you need 'Push' rights.
remote: User: user2
remote: Please read the documentation and contact an administrator
remote: if you feel the configuration is incorrect
remote: Processing changes: refs: 1, done    
To ssh://[email protected]:29418/HelloWorld.git
 ! [remote rejected] master -> master (prohibited by Gerrit)
error: failed to push some refs to 'ssh://[email protected]:29418/HelloWorld.git'
[user2@jenkins HelloWorld]$ 

這就是gerrit的精髓所在了。原因是gerrit不允許直接將本地修改同步到遠程倉庫。客戶機必須先push到遠程倉庫的refs/for/*分支上,等待審覈。這也是爲什麼我們需要使用gerrit的原因。gerrit本身就是個代碼審覈工具。

接下來更該push的地址:  
[user2@jenkins HelloWorld]$git config remote.origin.push refs/heads/*:refs/for/*  

此命令實際是更改的是本地倉庫test_project/.git/config文件。 
再次push   
[user2@jenkins HelloWorld]$git push origin  
這次不要加master
[user2@jenkins HelloWorld]$ git push origin
Counting objects: 5, done.
Writing objects: 100% (3/3), 249 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Processing changes: refs: 1, done    
remote: ERROR: missing Change-Id in commit message footer
remote: Suggestion for commit message:
remote: edit README
remote: 
remote: Change-Id: I7959fe47bc2d2f53539a1861aa6b0d71afe0a531
remote: 
remote: Hint: To automatically insert Change-Id, install the hook:
remote:   gitdir=$(git rev-parse --git-dir); scp -p -P 29418 [email protected]:hooks/commit-msg ${gitdir}/hooks/
remote: 
remote: 
To ssh://[email protected]:29418/HelloWorld.git
 ! [remote rejected] master -> refs/for/master (missing Change-Id in commit message footer)
error: failed to push some refs to 'ssh://[email protected]:29418/HelloWorld.git'

尼瑪,還是不行,說缺change-Id,爲了能讓每次commit能自己insert 這個change-id,需要從gerrit server上下載一個腳本

[user2@jenkins HelloWorld] scp -p 29418 [email protected]:hooks/commit-msg <local path to your git>/.git/hooks/

然後重新commit
[user2@jenkins HelloWorld]$ git commit --amend
再次查看git log
[user2@jenkins HelloWorld]$ git log
commit f6b5919170875b5b4870fca2ab906c516c97006e
Author: user2 <[email protected]>
Date:   Thu Dec 12 00:24:53 2013 -0500

    edit by user2
    
    Change-Id: Ieac68bebefee7c6d4237fa5c058386bf7c4f66b7

commit 98099fc0de3ba889b18cf36f9a5af267b3ddb501
Author: user1 <[email protected]>
Date:   Thu Dec 12 00:15:08 2013 -0500

    add README
[user2@jenkins HelloWorld]$ 

這次就有了change id
然後再次push
[user2@jenkins HelloWorld]$ git push origin
Counting objects: 5, done.
Writing objects: 100% (3/3), 289 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Processing changes: new: 1, refs: 1, done    
remote: 
remote: New Changes:
remote:   http://gerrit.example.com:8080/1
remote: 
To ssh://[email protected]:29418/HelloWorld.git
 * [new branch]      master -> refs/for/master
[user2@jenkins HelloWorld]$ 

終於尼瑪成功了!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章