涉及到的基本操作
- 登錄 gerrit
- 激活郵箱
- 獲取 http Credentials
- 拉取代碼
- 提交代碼
- Review & Verify & Submit
初次使用
登錄 gerrit -> 激活郵箱 -> 獲取并保存 http credentials(提交時要用)
激活郵箱
后續(xù) Push, Review, Verify, Submit, 接收通知 等都需要郵箱的支持减余。
- 登錄 -> 進入 Settings -> Email Addresses;
- 輸入郵箱地址 xxx@xxx.com, Click “Send VERIFICATION” button 發(fā)送驗證郵件;
- 接收郵件 訪問 驗證鏈接;
- done.
獲取 Http credentials
http 方式 Pull, Push 時用篱瞎。
- 登錄 gerrit -> 進入 Settings -> HTTP Credentials;
- 點擊 "GENERATE NEW PASSWORD" Button 獲取 password;
-
done.
開發(fā)
Pull -> Commit -> Push(帶上Change-Id)
拉取代碼
BROWSE -> Repositories。
倉庫地址在倉庫詳情頁盾碗。
Attention
Pull 時選擇 "Clone with commit-msg hook" 方式以便 拿到 commit-msg (.git/hooks/commit-msg) 。
- Http 方式;
- ssh 方式;
提交代碼
確保 commit footer 有 Change-Id 信息措嵌。
Change-Id 可從通過 commit-msg (.git/hooks/commit-msg) 生成骏令。
Strongly recommended:
只需確保項目目錄(.git/hooks/)下有 commit-msg 腳本,再配合對應(yīng) 的 gerrit 插件即可在 Commit 時完成 Change-Id 的自動生成厉亏。
Idea, Eclipse 都有相應(yīng)的 gerrit 插件董习。
Change-Id
用于標(biāo)識 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 -> 選擇對應(yīng)的 Change -> REPLY;
添加接收者爱只,抄送者皿淋,評論,并對 Code-Review, Verified(若有權(quán)限) 打分。
若 Code-Review Verified 對應(yīng)的分?jǐn)?shù)均符合 Sumbmit 要求窝趣,
則 當(dāng)前Change 狀態(tài)變?yōu)?Ready to submit, 放出 Sumbim 按鈕疯暑。點擊 Submit 按鈕 完成 變更往 gerrit 倉庫 master 分支的提交。
Git 知識準(zhǔn)備
對于一些進階操作或部分問題的處理哑舒,要求對 git 有一定的程度的深入了解妇拯。
rebase & merge
rebase(變基), merge
- 共同點:都有整合代碼的功能
- 異同:merge操作會生成一個新的節(jié)點(commit)來承載這次整合,之前的提交分開顯示洗鸵。而rebase操作不會生成新的節(jié)點(整合在原有的commit 上完成)乖阵,是將兩個分支融合成一個線性的提交。
git commit --amend
對前一次 commit 進行微調(diào)(打補丁)预麸,不產(chǎn)生新的 Commit瞪浸。
git commit –amend [options]
fetch vs pull
可簡單理解為: 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 時,保留工作目錄和暫存區(qū)中的內(nèi)容吏祸,并把重置 HEAD 所帶來的新的差異放進暫存區(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的同時贡翘,保留工作目錄蹈矮,并且清空暫存區(qū),并把重置 HEAD 所帶來的新的差異放在工作目錄鸣驱。
-
reset --hard
Resets the index and working tree. Any changes to tracked files in the working tree since <commit> are discarded.
重置 HEAD 和branch的同時泛鸟,重置stage區(qū)和工作目錄里的內(nèi)容
參考文檔 git reset
Caution
- 應(yīng)總是確保 Commit 有對應(yīng)的 Change-Id
- 盡量采用 rebase 方式合并代碼, 而非 merge 方式
Problems
一些常見的問題及對應(yīng)的解決方案。
初次使用 Push 時遇到 鑒權(quán)失敗
- 首先應(yīng)確保 gerrit 賬戶名無誤踊东;
- 檢查 Push 密碼 是否為 Http Credentials北滥;
初次使用 Push 時遇到 remote rejected
此種情況多是由于 本地 git 配置 name, email 與 gerrit 賬戶名, 注冊郵箱不符。
解決方案:查看并修改 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
問題分析
這個提示表示沒有新的提交闸翅。Gerrit審核根據(jù)commit
id和changeId來判斷是否是新的提交再芋。
情況一:如果確實需要提交,比如在初次建立新的分支的時候坚冀,兩個分支的內(nèi)容完全一模一樣
解決辦法:
通過git commit –amend生成新的changeId济赎。
情況二: 合并時,合并的那些歷史的 commit 節(jié)點记某,在 gerrit 上都已經(jīng)評審過了司训,都是已有的 change 單,所以 gerrit 認(rèn)為沒有新的提交液南,就不讓你提交評審壳猜。
解決辦法:
在 git merge 的時候,加上 --no-ff 參數(shù)贺拣,是為了讓它生成一個新的 commit蓖谢,這樣就可以提交了~(不過生成的 gerrit change 是看不到改動信息的
結(jié)合 Idea gerrit 插件的使用:
- 合并時勾選 "No fast forward" 選項;
- Push 時,不勾選 "Push to Gerrit" 選項;
because ref update failed: REJECTED_OTHER_REASON commit ff9671c: missing Change-Id in message footer
解決辦法:
- 通過git commit –amend 生成新的changeId (推薦)譬涡;
- reset 到上一次 Commit, 生成新的changeId闪幽,重新提交;
One or more refs/for/ names blocks change upload The remote end hung up unexpectedly
問題描述:相應(yīng)分支掛起(可簡單理解為分支狀態(tài)異常)
解決方案:
在對應(yīng)倉庫下執(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 前通過 rebase 方式拉代碼
git pull --rebase
git push
git stash pop
Gerrit 提示沖突,不能合并代碼(git解決遠(yuǎn)程沖突)
- 將存在沖突的 Change Abandon(丟棄)
- 在本地處理好沖突(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 #這只是一個舉例,即要先add操作
git rebase --continue
git push origin HEAD:refs/for/master #OK了
項目管理
遷移舊項目
以 gitlab 為例舌劳。
以管理員身份登錄 gerrit -> 創(chuàng)建項目倉庫 repo_demo -> 進入 gerrit_home/<git_dir> 以 gitlab 中同名項目覆蓋之(即刪除 repo_demo
-> 再從 gitlab 克隆同名項目)
# 刪除 repo_demo
rm -rf repo_demo
# 從 git 倉庫全量克隆同名項目
git clone --mirror <repo_url>
# 若 gitlab 倉庫代碼有更新則 再全量拉取一次 即可
git fetch --all