不廢話,放腳本:

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 成功~

原文鏈接: https://blog.spencerwoo.com/20 ... pull/

相關文章