shell 批量更新多个git仓库

  1. 使用shell批量更新git仓库
    1. 具体代码如下

使用shell批量更新git仓库

具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/bin/bash
# 定义日志文件路径
LOG_FILE=$(pwd)/update-git.log

echo "update $(pwd) now" > $LOG_FILE

# for d in */; do cd $d; git stash; (git pull &); cd ..; done

function updateRepo(){
echo "`date '+%Y%m%d-%H:%M:%S'` --> $1 will be updated"
echo "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" >> $LOG_FILE
echo "┃ `date '+%Y%m%d-%H:%M:%S'` --> $1 is updating now ....... ┃" >> $LOG_FILE
echo "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛" >> $LOG_FILE
REPO_URL=`cat .git/config | grep 'url = '`
REAL_URL=${REPO_URL/ url = /}
echo "`date '+%Y%m%d-%H:%M:%S'` --> real repository url is $REAL_URL" >> $LOG_FILE
if [[ -n $(git ls-remote --heads $REAL_URL | wc -l) ]];then
git log --pretty=oneline -1 >> $LOG_FILE
BRANCH_NAME=`git branch | grep \* | cut -d ' ' -f2`
echo "`date '+%Y%m%d-%H:%M:%S'` --> $1 current branch is $BRANCH_NAME" >> $LOG_FILE
git fetch --all >> $LOG_FILE
# git reset --hard HEAD >> $LOG_FILE
echo "`date '+%Y%m%d-%H:%M:%S'` --> reset command is git reset --hard origin/$BRANCH_NAME" >> $LOG_FILE
git reset --hard origin/$BRANCH_NAME >> $LOG_FILE
git pull 2>&1 | tee -a $LOG_FILE
echo "`date '+%Y%m%d-%H:%M:%S'` --> $1 has been updated" >> $LOG_FILE
else
echo "`date '+%Y%m%d-%H:%M:%S'` --> $1 could not access from remote" >> $LOG_FILE
fi
echo "`date '+%Y%m%d-%H:%M:%S'` --> $1 has been updated"
}

function gotoDir(){
limit = 2 # 定义目录遍历的层级
if [[ $1 -lt $limit ]]; then
for dir in `ls $(pwd)`;do
case $dir in
# 定义需要忽略更新的目录
"Auto.js" | "AppService")
echo "`date '+%Y%m%d-%H:%M:%S'` --> $dir will be ignore" >> $LOG_FILE
;;
*)
if [[ -d $dir ]]; then
cd $dir
temp=$(($a+1))
if [[ -d "./.git" ]]; then
updateRepo $(pwd)
else
echo "`date '+%Y%m%d-%H:%M:%S'` --> $dir will be updated"
echo "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■" >> $LOG_FILE
echo "■ `date '+%Y%m%d-%H:%M:%S'` --> $dir is updating now ....... ■" >> $LOG_FILE
echo "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■" >> $LOG_FILE
gotoDir $temp $dir
echo "`date '+%Y%m%d-%H:%M:%S'` --> $dir is not a git repo, because the '$dir/.git' not exist" >> $LOG_FILE
fi
cd ..
else
echo "`date '+%Y%m%d-%H:%M:%S'` --> $dir is not a directory" >> $LOG_FILE
fi
;;
esac
done
else
echo "`date '+%Y%m%d-%H:%M:%S'` --> all repositories in $2 are updated"
cd ..
fi
}

function updateAll(){
count=0
echo "████████████████████████████████████████████████████████████████████████████████████" >> $LOG_FILE
echo "█ `date '+%Y%m%d-%H:%M:%S'` --> $(pwd) will be updated █" >> $LOG_FILE
echo "█ `date '+%Y%m%d-%H:%M:%S'` --> $(pwd) is updating now ....... █" >> $LOG_FILE
echo "████████████████████████████████████████████████████████████████████████████████████" >> $LOG_FILE
gotoDir $count $(pwd)
echo "`date '+%Y%m%d-%H:%M:%S'` --> all repositories in $(pwd) are updated"
}

updateAll

exit

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 nathanwriting@126.com

文章标题:shell 批量更新多个git仓库

字数:596

本文作者:Nathaniel

发布时间:2021-02-14, 12:26:56

最后更新:2023-11-06, 22:59:18

原始链接:http://example.com/2021/02/14/update-git-shell/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

×

喜欢就点赞,疼爱就打赏