最近闲来无事,于是开始研究起 shell
脚本。因为我文件夹下的 git 仓库过多,但是又不是每天打开来看,所以我写了一个可以实现批量从远程拉取代码的bash
脚本。技术难度不大,但这两天不知道有什么可以写的了,这里拿来凑数吧。
首先我的代码是统一放在一个文件夹下的,如下:
tree code
D:\DESKTOP\CODE
├─git仓库1
├─git仓库2
├─git仓库3
├─...
├─git仓库n
我将代码放在了 code
文件夹下,在这个文件夹下有多个工程,分别对应不同的 git 仓库。
#! /bin/bash
function batch_fetch_code(){
#注意此处这是两个反引号,表示运行系统命令
for file in `ls $1`
do
# 拼接当前路径
curr_dir="$1/$file"
# 判断当前路径是否目录,如果是目录的话执行下一步操作
if [ -d $curr_dir ] #注意此处之间一定要加上空格,否则会报错
then
echo "try fetching code in $curr_dir" #在此处处理文件即可
# 进入该目录,判断是否为git仓库,如果是的话更新代码
cd $curr_dir && git status && git fetch
fi
done
}
#执行上面的函数,后面带着目标目录
batch_fetch_code /d/Desktop/code
这段代码实现了拉取 code
文件夹下的所有git仓库的远端代码。我没有使用 git pull
是因为我有的仓库使用的是本地分支,而没有远端分支无法合并。总的来看git fetch
更保险一些。代码不难,这里做一波简单的分析。
for file in `ls $1`
do
# code here
echo "current iterate in $1/$file"
done
这段代码会读取变量 $1
,并且会列举出对应的所有文件/目录
,然后使用 for 循环遍历所有文件。我们可以使用这段代码对一个目录下的所有文件进行操作。
if [ -d $curr_dir ] #注意此处之间一定要加上空格,否则会报错
then
# code here
fi
[ -d $curr_dir ]
是 bash 中的一个判断逻辑,用于判断目标路径是否为一个目录。后面的if
代码块不做说明了。
cd $curr_dir && git status && git fetch
这段代码是从远端仓库拉取代码的主要逻辑。首先进入目标目录,使用 git status
判断这个目录是否是一个git 仓库
,如果这个目录是一个 git 仓库的话则会返回:
[root@node01 ~]# git status
fatal: Not a git repository (or any of the parent directories): .git
[root@node01 ~]# echo $?
128
可以看到当目标目录不是一个 git 仓库的时候抛出一个提示信息,并且返回值不是0,而是错误代码128。
[root@node01 ~]# git status
On branch v5-master
Your branch is up to date with 'origin/v5-master'.
nothing to commit, working tree clean
[root@node01 ~]# echo $?
0
可以看到当目标目录是一个 git 仓库的时候返回仓库当前的状态,并且返回值为0。
我们可以利用这一点使用 && 逻辑运算符实现命令当目标路径是一个 git 仓库的时候拉取远端代码。