推送評審模式通過簡化 git push 流程,無需額外工具即可自動建立和管理程式碼檢閱,提升代碼品質和協作效率。
自動化程式碼檢閱
雲效代碼管理的AGit-Flow模式,支援使用git pr來通過命令列直接建立程式碼檢閱,解決了建立評審的效率問題。使用該模式需要開發人員在本地安裝git-repo工具,並執行指定的命令。另一方面,不少開發人員也會關注是否可以針對提交的代碼進行審核,通過審核的代碼才可以被推送進目標分支。那麼有沒有這樣一種方式,在不需要安裝任何工具的情況下,執行git push就可以自動建立評審,並且能夠支援對提交進行評審?使用推送評審模式,可以實現這一目標。
推送評審模式及其優勢
推送評審模式,是Codeup新推出的一種代碼協同方式,可以為使用者帶來全新、高效的程式碼檢閱體驗:
從開發人員的角度,發起程式碼檢閱不再需要建立新分支,也不必在開發完成後切換至瀏覽器來建立程式碼檢閱,直接執行
git push即可一鍵發起評審。從管理者的角度,可以設定讓開發人員向倉庫
push代碼時,不再直接更新分支的代碼,而是自動建立程式碼檢閱,通過評審的方式,保障代碼品質。
推送評審模式與現有分支模式對比:
分支開發模式 | 推送評審模式 | |
提交代碼 | 在特性分支中提交 | 直接在主幹上提交 |
發起程式碼檢閱 | Codeup網頁端操作 | 執行 |
更新程式碼檢閱 | 更新特性分支 | 繼續執行 |
貢獻代碼要求的權限 | 開發人員及以上角色 | 瀏覽者及以上許可權 |
代碼品質 | 僅保護分支受管控 | 所有分支的 push 均受管控 |
在程式碼程式庫設定中開啟推送評審模式後,具有以下優勢:
向倉庫貢獻代碼,發起程式碼檢閱,不再需要建立新的分支,直接在主幹上進行修改並提交即可,避免了冗餘的分支管理成本。
git push不再直接推送分支內容,而是建立/更新程式碼檢閱。如果代碼需要修補,提交後繼續執行
git push,已發起的評審會自動更新。向倉庫貢獻代碼不再需要授予開發人員許可權,擁有倉庫的瀏覽者許可權即可貢獻代碼,而且貢獻的代碼需要經過評審才能正式合入程式碼程式庫。因此可以將直接寫庫的許可權最小化到少數管理者手中,而大部分開發人員僅需要讀許可權即可,降低了程式碼程式庫被意外修改的風險。
支援指定
push option來控制具體的推送行為,見 使用推送評審模式進行協作 一節。
開啟方式
在中,可以看到推送評審模式的開關,單擊此開關即可開啟/關閉推送評審模式的功能:

開啟推送評審模式後,會改變git push的行為,請Crowdsourced Security Testing悉並理解後再開啟推送評審模式:
開啟推送評審模式後,執行
git push不再直接更新遠端的代碼(即便擁有倉庫的開發人員許可權),而是自動建立/更新程式碼檢閱。倉庫的瀏覽者,可以通過
git push發起評審,但請放心此時代碼還未合入分支,需要根據分支評審和合并要求通過後才可手動合入。由於
git push並不直接更新代碼而是建立評審,因此不會觸發推送事件的webhook。使用者可以在Codeup網頁端以評審的方式建立,編輯或刪除檔案。
使用推送評審模式進行協作
下面,用幾個實際的例子,說明如何使用推送評審模式進行開發協作。
自動建立評審
假設現在接到了一個開發工作單位,使用推送評審模式可以簡化為兩步:
在主幹上進行開發。
git push。
下面我們來具體看看。
在樣本倉庫的master分支上開發,並建立了一個提交
27e76f58。$ git log commit 27e76f582ca7207a695dd8762b66ef443adcc572 (HEAD -> master) Author: Codeup User <codeup.user@example.com> Date: Tue Oct 11 10:16:18 2022 +0800 feat: new feature Signed-off-by: Codeup User <codeup.user@example.com> commit 44094ec92eb122deab5a0367552bd081540c4353 (origin/master, origin/HEAD) Author: Codeup User <codeup.user@example.com> Date: Tue Oct 11 10:09:39 2022 +0800 Initial commit然後,我們將改動推送至遠端,執行
git push:$ git push 枚舉對象中: 4, 完成. 對象計數中: 100% (4/4), 完成. 使用 12 個線程進行壓縮 壓縮對象中: 100% (2/2), 完成. 寫入對象中: 100% (3/3), 310 位元組 | 310.00 KiB/s, 完成. 總共 3(差異 0),複用 0(差異 0),包複用 0 remote: +-----------------------------------------------------------------------------------+ remote: | The following tips are provided by Codeup: | remote: +-----------------------------------------------------------------------------------+ remote: | Merge request #31620 has been created, please visit: | remote: | https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31620 | remote: +-----------------------------------------------------------------------------------+ To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git * [new reference] master -> refs/merge-requests/31620/head
可以看到,開啟推送評審模式後,git push沒有直接更新遠端的代碼,而是建立了一個程式碼檢閱,ID 是31620。此程式碼檢閱的源為本地最新的提交,目標則是當前的分支。可以通過程式碼檢閱的詳情來確認:

通過這種方式,我們不再需要建立特性分支,也不必切換至瀏覽器建立評審,極大簡化了步驟。並且git push必須經過評審後才能合入,保障代碼品質。
自動更新評審
在程式碼檢閱的過程中,往往需要根據評審者的意見,多次反覆修改代碼,才能最終達到代碼的准入標準。那麼,在修改了代碼後,相應的程式碼檢閱要如何更新呢?這裡將介紹通過git push實現自動更新評審的方法。下面來看看實際的例子。
首先,在27e76f58的基礎上,根據評審意見修改了一些代碼並提交了e00db452。
$ git log
commit e00db4522f2d6ca5b42377ca76c7b3a7e12db8a5 (HEAD -> master)
Author: Codeup User <codeup.user@example.com>
Date: Tue Oct 11 11:09:42 2022 +0800
feat: fix comment
Signed-off-by: Codeup User <codeup.user@example.com>
commit 27e76f582ca7207a695dd8762b66ef443adcc572
Author: Codeup User <codeup.user@example.com>
Date: Tue Oct 11 10:16:18 2022 +0800
feat: new feature
Signed-off-by: Codeup User <codeup.user@example.com>
commit 44094ec92eb122deab5a0367552bd081540c4353 (origin/master, origin/HEAD)
Author: Codeup User <codeup.user@example.com>
Date: Tue Oct 11 10:09:39 2022 +0800
Initial commit然後,執行git push後,系統會自動更新程式碼檢閱狀態,並顯示相關提示資訊。
$ git push
枚舉對象中: 4, 完成.
對象計數中: 100% (4/4), 完成.
使用 12 個線程進行壓縮
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (3/3), 340 位元組 | 340.00 KiB/s, 完成.
總共 3(差異 0),複用 0(差異 0),包複用 0
remote: +-----------------------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: |
remote: +-----------------------------------------------------------------------------------+
remote: | Merge request #31620 has been updated, please visit: |
remote: | https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31620 |
remote: +-----------------------------------------------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
27e76f582c..e00db4522f master -> refs/merge-requests/31620/head根據提示資訊,這次推送更新了 ID 為31620的程式碼檢閱。查看評審詳情,看到程式碼檢閱的源版本已經變為了e00db4522,並且提交歷史也變為了2。如果代碼仍然需要修改,重複以上流程即可。
建立新的評審
重複執行git push命令,會自動更新已經存在的評審。如果並不想更新評審,而是想要建立一個新的評審,那要如何操作呢?這可以通過在 push 命令中添加push option來實現。具體來說,執行 git push -o review=new,就可以建立新的程式碼檢閱。
在本地改動一些代碼,執行git push -o review=new,成功建立了 ID 為31626的程式碼檢閱。
$ git push -o review=new
枚舉對象中: 4, 完成.
對象計數中: 100% (4/4), 完成.
使用 12 個線程進行壓縮
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (3/3), 361 位元組 | 361.00 KiB/s, 完成.
總共 3(差異 0),複用 0(差異 0),包複用 0
remote: +-----------------------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: |
remote: +-----------------------------------------------------------------------------------+
remote: | Merge request #31626 has been created, please visit: |
remote: | https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31626 |
remote: +-----------------------------------------------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
* [new reference] master -> refs/merge-requests/31626/head注意:如果推送時已存在與目標完全相同的評審,那麼將無法建立新的評審。
$ git push -o review=new
總共 0(差異 0),複用 0(差異 0),包複用 0
remote: +-----------------------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: |
remote: +-----------------------------------------------------------------------------------+
remote: | Merge request create failed. There exists a same merge request in progress: |
remote: | https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31620 |
remote: +-----------------------------------------------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
! [remote rejected] master -> master (create MR failed)
error: 無法推送一些引用到 'https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git'更新指定的評審
在同時有多個開啟的程式碼檢閱的情況下,執行git push時,會因無法判斷想要更新哪一個評審而失敗。
$ git push
枚舉對象中: 5, 完成.
對象計數中: 100% (5/5), 完成.
使用 12 個線程進行壓縮
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (3/3), 294 位元組 | 294.00 KiB/s, 完成.
總共 3(差異 1),複用 0(差異 0),包複用 0
remote: +-------------------------------------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: |
remote: +-------------------------------------------------------------------------------------------------+
remote: | You need to manually specify the merge request to update because there are already |
remote: | multiple merge requests that you created earlier for the same target branch: |
remote: | |
remote: | * [ID: 31626] https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31626 |
remote: | * [ID: 31620] https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31620 |
remote: | |
remote: | Then, update specific merge request based on it's ID (MR-ID): |
remote: | git push -o review=<MR-ID> |
remote: | |
remote: | Or you can create a new one: |
remote: | git push -o review=new |
remote: +-------------------------------------------------------------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
! [remote rejected] master -> master (unable to determine which mr to update)
error: 無法推送一些引用到 'https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git'提示資訊顯示同一目標分支有兩個評審,ID分別為31626以及31620,因此無法判斷想要更新的是哪一個評審。有兩種解決方式:
使用
-o review=new,建立一個新的程式碼檢閱。使用
-o review=<MR-ID>,指定要更新的評審ID。
第一種方式在建立新的評審一節中已經示範過了,我們來看如何更新指定的評審。
假如此時要更新31626評審,命令為:git push -o review=31626。
$ git push -o review=31626
枚舉對象中: 5, 完成.
對象計數中: 100% (5/5), 完成.
使用 12 個線程進行壓縮
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (3/3), 303 位元組 | 303.00 KiB/s, 完成.
總共 3(差異 1),複用 0(差異 0),包複用 0
remote: +-----------------------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: |
remote: +-----------------------------------------------------------------------------------+
remote: | Merge request #31626 has been updated, please visit: |
remote: | https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31626 |
remote: +-----------------------------------------------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
0ba010f2ff..037578c634 master -> refs/merge-requests/31626/head這樣,就更新了 ID為31626的程式碼檢閱。
更新評審的衝突解決
有時,想要更新程式碼檢閱時,會發現評審可能已被其他使用者更新,此時,為了避免其他使用者的更新被覆蓋,會導致更新失敗。假設我們要更新31644評審,執行:git push -o review=31644
$ git push -o review=31644
枚舉對象中: 4, 完成.
對象計數中: 100% (4/4), 完成.
使用 12 個線程進行壓縮
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (3/3), 326 位元組 | 326.00 KiB/s, 完成.
總共 3(差異 0),複用 0(差異 0),包複用 0
remote: +--------------------------------------------+
remote: | The following tips are provided by Codeup: |
remote: +--------------------------------------------+
remote: | MR is diverged with this push |
remote: +--------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
! [remote rejected] master -> master (MR is diverged with this push)
error: 無法推送一些引用到 'https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git'提示資訊表明此次push會引起評審的衝突,更新失敗。此時有兩種選擇:
拉取其他使用者的更新,在本地解決後再更新評審。
強制重新整理評審。
先來看第一種方式。拉取更新在本地解決後再更新評審。
首先,執行 git fetch origin refs/merge-requests/<mr-id>/head,這裡mr-id為31644,所以需要執行的命令是:git fetch origin refs/merge-requests/31644/head
$ git fetch origin refs/merge-requests/31644/head
來自 https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo
* branch refs/merge-requests/31644/head -> FETCH_HEAD然後,rebase本地的改動到評審對應的引用上。執行git rebase FETCH_HEAD。rebase操作可能會出現衝突,請根據實際情況解決。
$ git rebase FETCH_HEAD
成功變基並更新 refs/heads/master。這樣,本地就擁有了遠端的代碼,然後重新執行push。
$ git push -o review=31644
枚舉對象中: 4, 完成.
對象計數中: 100% (4/4), 完成.
使用 12 個線程進行壓縮
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (3/3), 331 位元組 | 331.00 KiB/s, 完成.
總共 3(差異 0),複用 0(差異 0),包複用 0
remote: +-----------------------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: |
remote: +-----------------------------------------------------------------------------------+
remote: | Merge request #31644 has been updated, please visit: |
remote: | https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31644 |
remote: +-----------------------------------------------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
a4a2cad45c..8da076fb44 master -> refs/merge-requests/31644/head這樣,就更新了31644這個程式碼檢閱。
強制重新整理評審
有時,不想合并其他使用者的改動,想要把評審強制重新整理成本地的版本,這個時候應該如何操作呢?
此時,需要知道兩個值。
一個是程式碼檢閱的ID,即程式碼檢閱URL的最後一段數字。例如,程式碼檢閱的URL是
https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31644,那麼這個評審的ID即為31644另一個是程式碼檢閱的源版本。在程式碼檢閱的詳情頁可獲得。這裡對應的源版本即為
8da076fb
然後,可以執行 git push -o review=<mr-id> -o old-oid=<old-oid>,對應這個例子,命令為git push -o review=31644 -o old-oid=8da076fb
這樣,就將31644這個評審重新整理成了本地的版本。注意,這個過程中,其他使用者的修改會被覆蓋,所以只有在明確的想要強制重新整理版本時,再執行這個命令,以免丟失其他使用者的修改。
$ git push -o review=31644 -o old-oid=8da076fb
總共 0(差異 0),複用 0(差異 0),包複用 0
remote: +-----------------------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: |
remote: +-----------------------------------------------------------------------------------+
remote: | Merge request #31644 has been updated, please visit: |
remote: | https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31644 |
remote: +-----------------------------------------------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
8da076fb44..8da076fb44 master -> refs/merge-requests/31644/head跳過評審,直接更新代碼
有時,可能僅僅做了一些微小的提交,例如改了代碼注釋中的錯別字,想要跳過程式碼檢閱,應該如何操作呢?此時,可以使用 git push -o review=no命令來跳過建立程式碼檢閱。命令的行為與未開啟推送評審模式時執行git push一致。需要注意的是,必須有相應分支的推送許可權才可以使用review=no直接推送代碼。
一些其他的說明
更新評審需要是評審者或是評審的作者,否則更新會失敗。
remote: +---------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: |
remote: +---------------------------------------------------------------------+
remote: | Merge request #31644 update failed. |
remote: | You need to be the author or reviewer to update this merge request. |
remote: +---------------------------------------------------------------------+