mgit2.0.2
05 / 07

結束代碼與自動化

把結果交給腳本判斷時,你需要知道的全部規則。

結束代碼

代碼意義
0所有儲存庫都成功(或搭配 --allow-empty 且找不到儲存庫)
1有儲存庫失敗,或找不到任何儲存庫
2命令列參數無法解析
127找不到或無法執行 git
130被 Ctrl+C(SIGINTSIGTERM)中斷
其他第一個失敗的 git 指令回傳什麼,mgit 就回傳什麼

多個儲存庫怎麼變成一個代碼

  1. 預設會全部跑完--keep-going),不會因為某一個失敗就停下。
  2. 整體結束代碼是第一個失敗的儲存庫回傳的代碼,而不是最後一個。
  3. --fail-fast 會在第一個失敗處停止,沒跑到的儲存庫在摘要裡算成 skipped。
  4. Ctrl+C 不算「某個儲存庫失敗」:它會讓整個執行立刻停止並回傳 130

比較 --fail-fast 與預設行為: mgit --fail-fast pull

中斷

Ctrl+C 會送到整個行程群組,也就是 mgit 啟動的那個 git 也收得到。mgit 因此把它當成「立刻停止」,不會繼續跑下一個儲存庫,也不會印出摘要。

跑起來之後按 Ctrl+C: mgit pull

在腳本裡使用

#!/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 訊息,也不會把那個訊息留在你的日誌裡。

試試被 head 截斷: mgit --list | head -n 3