Gerrit-使用指南

涉及到的基本操作

  1. 登錄 gerrit
  2. 激活郵箱
  3. 獲取 http Credentials
  4. 拉取代碼
  5. 提交代碼
  6. Review & Verify & Submit

初次使用

登錄 gerrit -> 激活郵箱 -> 獲取并保存 http credentials(提交時(shí)要用)

激活郵箱

后續(xù) Push, Review, Verify, Submit, 接收通知 等都需要郵箱的支持。

  1. 登錄 -> 進(jìn)入 Settings -> Email Addresses;
  2. 輸入郵箱地址 xxx@xxx.com, Click “Send VERIFICATION” button 發(fā)送驗(yàn)證郵件;
  3. 接收郵件 訪問(wèn) 驗(yàn)證鏈接;
  4. done.
Settings_Gerrit_email png.png

獲取 Http credentials

http 方式 Pull, Push 時(shí)用。

  1. 登錄 gerrit -> 進(jìn)入 Settings -> HTTP Credentials;
  2. 點(diǎn)擊 "GENERATE NEW PASSWORD" Button 獲取 password;
  3. done.


    gerrit_http_credentials.png

開(kāi)發(fā)

Pull -> Commit -> Push(帶上Change-Id)

拉取代碼

BROWSE -> Repositories。

倉(cāng)庫(kù)地址在倉(cāng)庫(kù)詳情頁(yè)。

Attention

Pull 時(shí)選擇 "Clone with commit-msg hook" 方式以便 拿到 commit-msg (.git/hooks/commit-msg) 。

  • Http 方式;
  • ssh 方式;

提交代碼

確保 commit footer 有 Change-Id 信息。

Change-Id 可從通過(guò) commit-msg (.git/hooks/commit-msg) 生成。

Strongly recommended:
只需確保項(xiàng)目目錄(.git/hooks/)下有 commit-msg 腳本,再配合對(duì)應(yīng) 的 gerrit 插件即可在 Commit 時(shí)完成 Change-Id 的自動(dòng)生成。

Idea, Eclipse 都有相應(yīng)的 gerrit 插件。

Change-Id

用于標(biāo)識(shí) commit。

Have a look

Parent:     65c50d48 (Update Dockerfile base image to 0.1.2)
Author:     xxxx <xxxxx@qq.com>
AuthorDate: 2019-12-12 17:41:51 +0800
Commit:     xxxx <xxxxx@qq.com>
CommitDate: 2019-12-12 17:41:51 +0800

add readme.md;

Change-Id: Iba58fbc6a1a440a9d3e2e48bbd72f898ba3cabc0

Review

Review & Verify & Submit

YOUR -> Changes -> 選擇對(duì)應(yīng)的 Change -> REPLY;

gerrit_reply.png
  1. 添加接收者,抄送者,評(píng)論,并對(duì) Code-Review, Verified(若有權(quán)限) 打分。

  2. 若 Code-Review Verified 對(duì)應(yīng)的分?jǐn)?shù)均符合 Sumbmit 要求,
    則 當(dāng)前Change 狀態(tài)變?yōu)?Ready to submit, 放出 Sumbim 按鈕。

  3. 點(diǎn)擊 Submit 按鈕 完成 變更往 gerrit 倉(cāng)庫(kù) master 分支的提交。

Git 知識(shí)準(zhǔn)備

對(duì)于一些進(jìn)階操作或部分問(wèn)題的處理,要求對(duì) git 有一定的程度的深入了解。

rebase & merge

rebase(變基), merge

  • 共同點(diǎn):都有整合代碼的功能
  • 異同:merge操作會(huì)生成一個(gè)新的節(jié)點(diǎn)(commit)來(lái)承載這次整合,之前的提交分開(kāi)顯示。而rebase操作不會(huì)生成新的節(jié)點(diǎn)(整合在原有的commit 上完成),是將兩個(gè)分支融合成一個(gè)線性的提交。

git commit --amend

對(duì)前一次 commit 進(jìn)行微調(diào)(打補(bǔ)丁),不產(chǎn)生新的 Commit。

git commit –amend [options]

fetch vs pull

可簡(jiǎn)單理解為: pull = fetch + merge

git reset

  • reset --soft

    Does not touch the index file or the working tree at all (but resets the head to <commit>, just like all modes do). This leaves all your changed files "Changes to be committed", as git status would put it.

    重置 HEAD 和 branch 時(shí),保留工作目錄和暫存區(qū)中的內(nèi)容,并把重置 HEAD 所帶來(lái)的新的差異放進(jìn)暫存區(qū)。

  • reset --mixed

    Resets the index but not the working tree (i.e., the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action.

    reset 默認(rèn)參數(shù) mixed。重置 HEAD 和branch的同時(shí),保留工作目錄,并且清空暫存區(qū),并把重置 HEAD 所帶來(lái)的新的差異放在工作目錄。

  • reset --hard

    Resets the index and working tree. Any changes to tracked files in the working tree since <commit> are discarded.

    重置 HEAD 和branch的同時(shí),重置stage區(qū)和工作目錄里的內(nèi)容

參考文檔 git reset

Caution

  • 應(yīng)總是確保 Commit 有對(duì)應(yīng)的 Change-Id
  • 盡量采用 rebase 方式合并代碼, 而非 merge 方式

Problems

一些常見(jiàn)的問(wèn)題及對(duì)應(yīng)的解決方案。

初次使用 Push 時(shí)遇到 鑒權(quán)失敗

  1. 首先應(yīng)確保 gerrit 賬戶名無(wú)誤;
  2. 檢查 Push 密碼 是否為 Http Credentials;

初次使用 Push 時(shí)遇到 remote rejected

此種情況多是由于 本地 git 配置 name, email 與 gerrit 賬戶名, 注冊(cè)郵箱不符。

解決方案:查看并修改 git 配置屬性 name, email

# 查看 git 配置
git config --list
# 修改 name 屬性
git config -- global user.name '<gerrit_user_name>'
# 修改 email 屬性
git config -- global user.email '<gerrit_registered_email>'
# 兩次檢查 git 配置... done.
git config --list

ref update failed: REJECTED_OTHER_REASON no new changes

問(wèn)題分析

這個(gè)提示表示沒(méi)有新的提交。Gerrit審核根據(jù)commit
id和changeId來(lái)判斷是否是新的提交。

情況一:如果確實(shí)需要提交,比如在初次建立新的分支的時(shí)候,兩個(gè)分支的內(nèi)容完全一模一樣

解決辦法:
通過(guò)git commit –amend生成新的changeId。

情況二: 合并時(shí),合并的那些歷史的 commit 節(jié)點(diǎn),在 gerrit 上都已經(jīng)評(píng)審過(guò)了,都是已有的 change 單,所以 gerrit 認(rèn)為沒(méi)有新的提交,就不讓你提交評(píng)審。

解決辦法:
在 git merge 的時(shí)候,加上 --no-ff 參數(shù),是為了讓它生成一個(gè)新的 commit,這樣就可以提交了~(不過(guò)生成的 gerrit change 是看不到改動(dòng)信息的

結(jié)合 Idea gerrit 插件的使用:

  1. 合并時(shí)勾選 "No fast forward" 選項(xiàng);
  2. Push 時(shí),不勾選 "Push to Gerrit" 選項(xiàng);
Select-No-fast-forward.png
No-Push-to-Gerrit.png

because ref update failed: REJECTED_OTHER_REASON commit ff9671c: missing Change-Id in message footer

解決辦法:

  1. 通過(guò)git commit –amend 生成新的changeId (推薦);
  2. reset 到上一次 Commit, 生成新的changeId,重新提交;

One or more refs/for/ names blocks change upload The remote end hung up unexpectedly

問(wèn)題描述:相應(yīng)分支掛起(可簡(jiǎn)單理解為分支狀態(tài)異常)

解決方案:

在對(duì)應(yīng)倉(cāng)庫(kù)下執(zhí)行以下命令

git for-each-ref refs/for
# 如果第一條命令執(zhí)行完后有輸出,再執(zhí)行下面的命令。
for n in $(git for-each-ref --format='%(refname)' refs/for);do git update-ref -d $n; done

! [remote rejected] master -> refs/for/master (you are not allowed to upload merges)

git stash
# 每次 push 前通過(guò) rebase 方式拉代碼
git pull --rebase
git push
git stash pop

Gerrit 提示沖突,不能合并代碼(git解決遠(yuǎn)程沖突)

  1. 將存在沖突的 Change Abandon(丟棄)
  2. 在本地處理好沖突(rebase/merge)再提交

以下是 rebase 方式(推薦)

## rebase 方式
git branch   #查看分支情況
git checkout master  #選擇分支
git fetch origin  #fetch與pull的區(qū)別,自己再搜吧~
git rebase origin/master  #查看有“CONFLICT (content): ”的地方,手工解決沖突后,下一步
git add dev/controller/web/index.php #這只是一個(gè)舉例,即要先add操作
git rebase --continue
git push origin HEAD:refs/for/master    #OK了

項(xiàng)目管理

遷移舊項(xiàng)目

以 gitlab 為例。

以管理員身份登錄 gerrit -> 創(chuàng)建項(xiàng)目倉(cāng)庫(kù) repo_demo -> 進(jìn)入 gerrit_home/<git_dir> 以 gitlab 中同名項(xiàng)目覆蓋之(即刪除 repo_demo
-> 再?gòu)?gitlab 克隆同名項(xiàng)目)

# 刪除 repo_demo
rm -rf repo_demo
# 從 git 倉(cāng)庫(kù)全量克隆同名項(xiàng)目
git clone --mirror <repo_url>
# 若 gitlab 倉(cāng)庫(kù)代碼有更新則 再全量拉取一次 即可
git fetch --all
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,241評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,939評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,697評(píng)論 6 409
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,182評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,406評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,933評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,772評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,973評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,638評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,866評(píng)論 1 285
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,644評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,953評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容