05 / 07
結束代碼與自動化
把結果交給腳本判斷時,你需要知道的全部規則。
結束代碼
| 代碼 | 意義 |
|---|---|
0 | 所有儲存庫都成功(或搭配 --allow-empty 且找不到儲存庫) |
1 | 有儲存庫失敗,或找不到任何儲存庫 |
2 | 命令列參數無法解析 |
127 | 找不到或無法執行 git |
130 | 被 Ctrl+C(SIGINT/SIGTERM)中斷 |
| 其他 | 第一個失敗的 git 指令回傳什麼,mgit 就回傳什麼 |
多個儲存庫怎麼變成一個代碼
- 預設會全部跑完(
--keep-going),不會因為某一個失敗就停下。 - 整體結束代碼是第一個失敗的儲存庫回傳的代碼,而不是最後一個。
--fail-fast會在第一個失敗處停止,沒跑到的儲存庫在摘要裡算成 skipped。- Ctrl+C 不算「某個儲存庫失敗」:它會讓整個執行立刻停止並回傳
130。
比較 --fail-fast 與預設行為: mgit --fail-fast pull
中斷
Ctrl+C 會送到整個行程群組,也就是 mgit 啟動的那個 git 也收得到。mgit 因此把它當成「立刻停止」,不會繼續跑下一個儲存庫,也不會印出摘要。
在腳本裡使用
#!/usr/bin/env sh
set -eu
# 只要有任何一個 repo 有未提交的變更就失敗
if [ -n "$(mgit --quiet --color=never status --porcelain)" ]; then
echo 'working trees are not clean' >&2
exit 1
fi
# 先更新,再把失敗的名字挑出來
mgit pull 2> pull-errors.txt || {
echo 'some repositories failed:' >&2
grep '✗' pull-errors.txt >&2
}
在 CI 裡使用
- name: Update every checkout
run: mgit --color=never --summary pull
- name: Fail when anything is dirty
run: |
test -z "$(mgit -q --color=never status --porcelain)"
CI 日誌CI 的輸出通常不是終端機,所以顏色本來就會自動關掉;寫上
--color=never 只是把這件事講明白。管線與 SIGPIPE
mgit --list | head -n 3 這種用法是安全的:mgit 會還原 SIGPIPE 的預設行為,讀取端關閉時它安靜結束,不會噴出 panic 訊息,也不會把那個訊息留在你的日誌裡。