shell 批量更新多个git仓库 v2

  1. 为了简单化更新本地所有的git仓库
    1. 代码如下

为了简单化更新本地所有的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

#!/bin/bash
###
# @Author: Nathaniel
# @Date: 2021-02-14 17:05:46
# 当然find还有很多实用的参数,我们可以更加细化的配置,
# 比如聚目录查找层级: maxdepth(最大) , mindepth(最小)
# find . -maxdepth 3 -type d -name .git -exec sh -c "cd \"{}\"/../ && pwd && git pull --rebase" \;
###

LOG_FILE=$(pwd)/update-git.log

start_time=`date +%s`
echo "`date '+%Y%m%d-%H:%M:%S'` --> update $(pwd) now" > $LOG_FILE

## 查找所有git仓库(包含.git的目录),并且按照字母降序排序(A->Z --> a->z)
for repoGit in `find $(pwd) -maxdepth 3 -type d -name .git | sort -t '\\0' -n`; do
repoDir=`cd $repoGit/../ && pwd | awk '{print $1}'`
echo "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■" 2>&1 | tee -a $LOG_FILE
echo "■ `date '+%Y%m%d-%H:%M:%S'` --> $repoDir is updating now ......." 2>&1 | tee -a $LOG_FILE
repoUrl=`cat $repoGit/config | grep 'url = '`
realUrl=`echo ${repoUrl/ url = /} | awk '{print $3}'`
echo "■ `date '+%Y%m%d-%H:%M:%S'` --> $repoDir remote url is $realUrl" 2>&1 | tee -a $LOG_FILE
cd $repoDir
branchName=`git branch | grep \* | cut -d ' ' -f2`
if [[ $(git ls-remote --heads origin $branchName | wc -l | awk '{print $1}') -eq 1 ]]; then
echo "■ `date '+%Y%m%d-%H:%M:%S'` --> $repoDir has linked remote"
echo "■ `date '+%Y%m%d-%H:%M:%S'` --> $repoDir branch is $branchName" 2>&1 | tee -a $LOG_FILE
git fetch --all
echo "■ `date '+%Y%m%d-%H:%M:%S'` --> recent git log is `git log --pretty=oneline -1` " 2>&1 | tee -a $LOG_FILE
result=$(git status --short -uno | wc -l | awk '{print $1}')
echo "■ `date '+%Y%m%d-%H:%M:%S'` --> $repoDir branch is $branchName, git status -s is $result" 2>&1 | tee -a $LOG_FILE
if [[ $result -eq 0 ]]; then
echo "■ `date '+%Y%m%d-%H:%M:%S'` --> reset command is git reset --hard origin/$branchName" 2>&1 | tee -a $LOG_FILE
git reset --hard origin/$branchName 2>&1 | tee -a $LOG_FILE
git pull -f 2>&1 | tee -a $LOG_FILE
elif [[ $result =~ "error: unknown object type" ]]; then
rm -rf .git/objects/pack/*.pack
# git fsck --full --no-dangling
git reset --hard origin/$branchName 2>&1 | tee -a $LOG_FILE
git pull -f 2>&1 | tee -a $LOG_FILE
elif [[ $result =~ "error: error: Your local changes to the following files would be overwritten by merge" ]]; then
git reset --hard origin/$branchName 2>&1 | tee -a $LOG_FILE
git pull -f 2>&1 | tee -a $LOG_FILE
elif [[ $result =~ "error: Could not read" ]]; then
fileName=${repoDir##*/}
echo "■ `date '+%Y%m%d-%H:%M:%S'` --> current dir is $fileName" 2>&1 | tee -a $LOG_FILE
cd ..
git clone $realUrl -b $branchName -depth=1 2>&1 | tee -a $LOG_FILE
cd $fileName
git pull --unshallow 2>&1 | tee -a $LOG_FILE
else
echo "■ `date '+%Y%m%d-%H:%M:%S'` --> $repoDir has modified, only update" 2>&1 | tee -a $LOG_FILE
git pull 2>&1 | tee -a $LOG_FILE
fi
echo "■ `date '+%Y%m%d-%H:%M:%S'` --> $repoDir has been updated" 2>&1 | tee -a $LOG_FILE
else
echo "■ `date '+%Y%m%d-%H:%M:%S'` --> $repoDir could not access from remote" 2>&1 | tee -a $LOG_FILE
fi
echo "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■" 2>&1 | tee -a $LOG_FILE
echo -e "\n\n\n" >> $LOG_FILE
done

echo "`date '+%Y%m%d-%H:%M:%S'` --> all repositories in $(pwd) are updated" 2>&1 | tee -a $LOG_FILE

stop_time=`date +%s`
echo "TIME:`expr $stop_time - $start_time`"


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

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

字数:749

本文作者:Nathaniel

发布时间:2021-03-08, 10:29:37

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

原始链接:http://example.com/2021/03/08/update-git-shell-v2/

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

×

喜欢就点赞,疼爱就打赏