Git bulk实践

32 阅读3分钟

0x00 背景

最近接手一个新项目, 由于新项目有几十个repo仓库, 因此日常开发中会用到git bulk命令来辅助批量执行git 命令, 于是学习了一下git bulk的使用. git bulk 是开源项目git-extra 提供的众多命令中的一个, 详见说明见 git-bulk

0x01 使用

使用git bulk之前我们需要先安装git-extras, 接着为git bulk 添加工作空间, 这样就可以对工作空间下的repo进行批量操作.  

安装

Mac上直接在终端上执行如下命令:

brew install git-extras

安装成功后执行git bulk命令, 输出如下则说明安装成功

git bulk
usage: git bulk [--no-follow-symlinks] [--no-follow-hidden] [-q|--quiet] [-g] ([-a]|[-w <ws-name>]) <git command>
       git bulk --addworkspace <ws-name> <ws-root-directory> (--from <URL or file>)
       git bulk --removeworkspace <ws-name>
       git bulk --addcurrent <ws-name>
       git bulk --purge
       git bulk --listall
 

 

添加软链接

由于git bulk的工作空间对应一个目录, 如果各个repo不在同一个目录下, 则可以通过ln命令创建系统软链接来达到所有repo都在同一个目录下的效果.

创建一个目录作为工作空间, 如下

mkdir workspace

假设我们项目的repo为Aaa, Bbb, Ccc等, 可以通过如下命令创建各个repo的目录软链接, 放到目录workspace下面

ln -s /Users/xxx/yyy/Aaa /Users/xxx/workspace/Aaa
ln -s /Users/xxx/zzz/Bbb /Users/xxx/workspace/Bbb
ln -s /Users/xxx/www/Ccc /Users/xxx/workspace/Ccc
......

可以在编辑软件上先编辑好ln命令, 然后复制后丢到终端上执行, 执行后进入workspace目录, 执行ls命令, 可以看到Aaa、Bbb、Ccc等目录

添加工作空间

执行如下命令

git bulk --addworkspace workspace /Users/xxx/workspace

这里要注意的一点是添加的工作空间是忽略大小写的, 下面命令和上面效果的一样的

git bulk --addworkspace WorkSpace /Users/xxx/workspace

添加后再执行如下命令查看是否已经添加成功

git bulk --listall
## 输出如下
bulkworkspaces.workspace /Users/xxx/workspace

  至此我们已经安装好了git bulk并为我们项目的所有repo创建了一个对应的工作空间workspace, 让我们来试一下如何通过一行git bulk命令在所有repo中执行git pull操作

执行如下命令

git bulk -w workspace pull

输出如下

Core command "pull" accepted.
Executing bulk operation in workspace /Users/xxx/workspace
-> executing git pull in repository /Aaa
已经是最新的。
-> executing git pull in repository /Bbb
已经是最新的。
-> executing git pull in repository /Ccc
已经是最新的。
......

 

0x02问题记录

安装完成后, 执行git bulk命令时出现下面错误

git bulk -w workspace pull
## 输出如下
Selected single workspace mode in workspace: workspace
Core command "pull" accepted.
Executing bulk operation in workspace /Users/xxx/workspace
/usr/local/bin/git-bulk: line 190: readarray: command not found

原因: readarray 是 Bash 4.0+ 特有的命令,而我的Mac上默认的Bash版本为3.2.57

bash --version
## 输出如下
GNU bash, version 3.2.57(1)-release (arm64-apple-darwin24)
Copyright (C) 2007 Free Software Foundation, Inc.

解决: 更新bash到最新版本

brew install bash
## 安装完成后执行 bash --version 如下
bash --version
GNU bash,版本 5.2.37(1)-release (x86_64-apple-darwin23.6.0)

0x03 总结

本文介绍了一个强大的命令行工具git bulk, 支持在多repo的场景下高效地通过一行git bulk命令达到在所有repo中执行git命令的目的.