mgit2.0.2
03 / 07

它怎麼找儲存庫

全部只有六條規則,而且在 macOS、Linux、Windows 上的結果完全一致。

六條規則

  1. 當前目錄開始往下找,預設只找第一層(--depth 可以再往下)。
  2. 目錄裡有 .git 目錄.git 檔案都算儲存庫,所以 git worktree 與 submodule 都認得。
  3. 找到儲存庫之後不會再往裡面走,submodule 或 vendored 的專案因此不會被重複算進來。
  4. 符號連結會被跟進,而且以「看到的名字」為準:repolink -> repo 並存時兩個名字都會執行;同時走訪過的實際目錄只進入一次,所以連結迴圈不會無限迴圈。
  5. 結果依名稱排序(忽略大小寫,完全相同時再比原始拼法),三個作業系統的順序一致。
  6. 一個都沒找到時會警告並以 1 結束;但如果當前目錄本身就是儲存庫,mgit 會直接在那裡執行 git,行為等同直接呼叫 git。

在有第二層的目錄裡試: mgit --list

--depth 的意思

層數是從當前目錄往下數的:--depth 1(預設)只看直接子目錄,--depth 2 會再往下一層。因為規則 3 的關係,加大層數不會讓 mgit 走進已經找到的儲存庫裡。

比較 --depth 1 與 2: mgit --depth 2 --list

先看再做任何會改變狀態的指令之前,mgit --list 都可以先告訴你到底會動到哪幾個目錄。

worktree 與 submodule

git worktree 建立的目錄、以及 submodule 的工作目錄,它們的 .git 是一個檔案而不是目錄。mgit 兩種都認,所以這兩種目錄都會被找到並執行。

看 .git 是檔案的情況: mgit --list

連結以「看到的名字」為準,這一點刻意與 1.0 的 shell 版本 */ glob 行為相同。走訪過的實際目錄只會進入一次,所以即使你把某個目錄連回它的上層,搜尋還是會結束。

看連結會發生什麼事: mgit --depth 2 --list

讀不到的目錄

沒有讀取權限的目錄不會讓整個執行失敗:mgit 會在 stderr 留下一行警告,然後把其他目錄跑完。

看警告與其他目錄照常執行: mgit --depth 2 --summary

一個都沒找到

找不到任何儲存庫時,mgit 會在 stderr 印出警告並以 1 結束。這是 2.0 相對 1.0 刻意修掉的缺陷(舊版完全靜默、而且回傳 0)。要回到舊行為請加 --allow-empty

比較有沒有 --allow-empty: mgit --allow-empty