分享一個維護多個 Git 倉庫的小腳本
不廢話,放腳本:
find . -maxdepth 3 -name .git -type d | rev | cut -c 6- | rev | xargs -I {} git -C {} pull
更爲方便的,直接將這部分加入你的 .zshrc 或者 .bash_profile:
alias gpall="find . -maxdepth 3 -name .git -type d | rev | cut -c 6- | rev | xargs -I {} git -C {} pull"
之後,直接執行 gpall 即可。
好了,我們進入正題。
維護多個 Git 倉庫的需求
維護多個 Git 倉庫不容易。我在我存放 GitHub 倉庫的目錄下運行了一下 tree:
. ├── AIP_BackEnd ├── Evaluation_BackEnd | ... ... ├── SchoolProjects │ ├── Distance-Vector-Algorithm │ ├── cartoonize-images | ... ... │ ├── zanpress-blog │ └── zanpress-diagram | ... ... └── wechat-format 103 directories
103 個目錄……我自己 Documents/GitHub 文件夾下就有這麼多 Git 倉庫,一個一個去更新真的很費事情。如何批量更新 GitHub 本地倉庫呢?其實就是一個遍歷目錄,對匹配到的 Git 倉庫在其當前分支下執行 git pull 的需求嘛,很簡單。
解決方法
在 Medium 上面,我找到了一個相當優雅的腳本。前面這個腳本已經分享給各位了,我們重新看一下:
find . -maxdepth 3 -name .git -type d | rev | cut -c 6- | rev | xargs -I {} git -C {} pull
可以發現,這一長串命令,事實上就是前面的命令執行結果通過「管道」輸出至後面的命令作爲輸入,也就是命令中 | 的功能。我們一段一段看一下這個命令具體都幹了什麼。
用 find 搜索目錄下全部 .git/ 文件夾
每個 Git 文件夾裏面一定有 .git 的目錄,我們只需要找到 .git 文件夾既可以找到 Git 目錄。
find . -maxdepth 3 -name .git -type d
這裏,我們就使用了 find 的命令,詳見: GNU - Finding Files 。我們將命令分解來看:
- . 表示匹配命令執行路徑下的全部文件與文件夾
- -maxdepth 3 表示向下搜索最多三層級目錄
- -name .git 就是搜索名稱爲 .git 的內容
- -type d 則指明瞭我們搜索的範疇:Directories(目錄)
一目瞭然,我們下面就這樣對每個命令進行分解和解釋。
裁剪出我們要的 .git 文件夾所在路徑
上面我們解析出來的路徑,每個路徑後面都包含一個 .git,我們需要統一將這個 .git 從字符串中刪掉,這樣才能一起對給定目錄執行 git pull。第二步我們進行目錄的裁剪。
... | rev | cut -c 6- | rev | ...
可以發現,這裏我們有三部分命令。我們依次對命令進行解析:
- rev:首先對搜索到的目錄(字符串)進行反轉
- cut -c 6-:我們利用 cut 工具將路徑進行裁剪,-c 表示刪減的是字符(Characters),6- 表示我們刪去路徑的前 6 個字符(即:.git)
- rev:將處理好的字符串反轉回來
利用 xargs 執行帶參數的 git pull
上一步,我們已經提取出來所有包含 .git 的文件夾,現在我們需要批量的執行 git pull 來統一拉取倉庫。
xargs -I {} git -C {} pull
由於 Git 並不支持傳入目錄等參數,因此我們需要藉助於 xargs 來給 Git 傳入拉取路徑。上面的命令簡明易懂,就相當於 xargs 告訴 Git 拉取以上目錄下的全部 Git 倉庫。我們來看一看效果:
b( ̄▽ ̄)d 成功~