03 / 07
它怎麼找儲存庫
全部只有六條規則,而且在 macOS、Linux、Windows 上的結果完全一致。
六條規則
- 從當前目錄開始往下找,預設只找第一層(
--depth可以再往下)。 - 目錄裡有
.git目錄或.git檔案都算儲存庫,所以git worktree與 submodule 都認得。 - 找到儲存庫之後不會再往裡面走,submodule 或 vendored 的專案因此不會被重複算進來。
- 符號連結會被跟進,而且以「看到的名字」為準:
repo與link -> repo並存時兩個名字都會執行;同時走訪過的實際目錄只進入一次,所以連結迴圈不會無限迴圈。 - 結果依名稱排序(忽略大小寫,完全相同時再比原始拼法),三個作業系統的順序一致。
- 一個都沒找到時會警告並以
1結束;但如果當前目錄本身就是儲存庫,mgit 會直接在那裡執行 git,行為等同直接呼叫 git。
--depth 的意思
層數是從當前目錄往下數的:--depth 1(預設)只看直接子目錄,--depth 2 會再往下一層。因為規則 3 的關係,加大層數不會讓 mgit 走進已經找到的儲存庫裡。
比較 --depth 1 與 2: mgit --depth 2 --list
先看再做任何會改變狀態的指令之前,
mgit --list 都可以先告訴你到底會動到哪幾個目錄。worktree 與 submodule
git worktree 建立的目錄、以及 submodule 的工作目錄,它們的 .git 是一個檔案而不是目錄。mgit 兩種都認,所以這兩種目錄都會被找到並執行。
符號連結
連結以「看到的名字」為準,這一點刻意與 1.0 的 shell 版本 */ glob 行為相同。走訪過的實際目錄只會進入一次,所以即使你把某個目錄連回它的上層,搜尋還是會結束。
看連結會發生什麼事: mgit --depth 2 --list
讀不到的目錄
沒有讀取權限的目錄不會讓整個執行失敗:mgit 會在 stderr 留下一行警告,然後把其他目錄跑完。
看警告與其他目錄照常執行: mgit --depth 2 --summary
一個都沒找到
找不到任何儲存庫時,mgit 會在 stderr 印出警告並以 1 結束。這是 2.0 相對 1.0 刻意修掉的缺陷(舊版完全靜默、而且回傳 0)。要回到舊行為請加 --allow-empty。