使用 git-bash 脚本批量更新git仓库代码

最近闲来无事,于是开始研究起 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 仓库的时候拉取远端代码。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值