批量更新git仓库

        本地有100多个git仓库,手工同步更新是一件麻烦而痛苦的事情!经过分析,可使用git脚本+定时任务,实现自动同步。解放自己,做更有意义的事情。

目录

1、批量更新脚本

2、执行验证脚本

3、查看日志输出

3.1、本地仓库目录

3.2、远程仓库列表

3.3、同步日志列表


运行环境:

  • CentOS-7.9-X86_64
  • Windows-7-Ultimate-x64、Windows-10-BusinessEditions-1909-x64

1、批量更新脚本

        脚本主要功能是通过遍历本地目录,解析本地目录的git仓库信息,并从远程拉取最新代码到本地。

vi /opt/git-repo-sync-script.sh

脚本内容如下(版本已更新至 2026.01.23):

#!/bin/bash
echo "# ##################################################"
echo "# Subject: 遍历git本地仓库拉取更新代码"
echo "#    Date: 2020.11.10"
echo "#  Author: 狂龙骄子"
echo "#    Blog: https://blog.csdn.net/Sn_Keys"
echo "#  Remark: 配置定时任务同步,每周一上午9点执行"
echo "#           0 9 * * 1 nohup /opt/git-repo-sync-script.sh"
echo "# History: "
echo "# 2020.11.10: new"
echo "# 2026.01.23: 优化拉取日志合并逻辑"
echo "# ##################################################"

# 设置环境变量:解决git log中文乱码
export LESSCHARSET=utf-8
# 系统日期时间
DATETIME=`date +"%Y%m%d_%H%M%S"`

# 根搜索目录
SEARCH_ROOT_DIR="$1"
# 本地仓库目录列表
GIT_LOCAL_REPO_LIST=${SEARCH_ROOT_DIR}/gitRepoLocalList-${DATETIME}.txt
# 远程仓库地址列表
GIT_REMOTE_REPO_LIST=${SEARCH_ROOT_DIR}/gitRepoRemoteList-${DATETIME}.txt
# 拉取日志
GIT_PULL_LOG=${SEARCH_ROOT_DIR}/gitRepoPullLog-${DATETIME}.txt

# 仓库拉取日志文件列表
GIT_PULL_LOG_FILE_LIST=${SEARCH_ROOT_DIR}/gitRepoPullLogFileList-${DATETIME}.txt
# 仓库拉取日志文件目录
GIT_PULL_LOG_DIR="${SEARCH_ROOT_DIR}/${DATETIME}"
mkdir -p "${GIT_PULL_LOG_DIR}"

# 获取所有.git文件夹
find "${SEARCH_ROOT_DIR}" -type d -name ".git">"${GIT_LOCAL_REPO_LIST}"

# 从远程仓库拉取最新
gitPull() {
    echo "------------------------------`date +\"%Y-%m-%d %H:%M:%S\"`------------------------------"
    echo "本地目录: $1"
    echo "远程仓库: $2"

    # 获取所有分支最新
    git fetch -v --progress "origin"
    # 获取当前分支最新
    #git pull -v --progress "origin"
    # 等待进程结束再拉取下一个仓库
    #pid=$!
    #wait $pid
}

# 遍历本地仓库目录
while read line ; do
    cd "$line/../"
    # 获取远程仓库地址
    REMOTE_REPO_URL=`git remote -v | awk 'NR==1{print $2}'`
    echo "${REMOTE_REPO_URL}">>"${GIT_REMOTE_REPO_LIST}" 2>&1 &
    # 拉取日志
    REMOTE_REPO_PULL_LOG="${GIT_PULL_LOG_DIR}/${PWD##*/}.txt"
    echo "${REMOTE_REPO_PULL_LOG}">>"${GIT_PULL_LOG_FILE_LIST}" 2>&1 &
    # 从远程仓库拉取最新
    gitPull "`pwd`" "${REMOTE_REPO_URL}">>"${REMOTE_REPO_PULL_LOG}" 2>&1 &
done < "${GIT_LOCAL_REPO_LIST}"

# 遍历仓库拉取日志文件列表
while read line ; do
    # 合并拉取日志
    cat "$line">>"${GIT_PULL_LOG}" 2>&1 &
    echo -e "\n\n">>"${GIT_PULL_LOG}" 2>&1 &
done < "${GIT_PULL_LOG_FILE_LIST}"

# 切换到根搜索目录
cd "${SEARCH_ROOT_DIR}"

# 压缩日志(备份)
#tar -czvf "gitRepoPullLog-${DATETIME}.tar.gz" --directory="${GIT_PULL_LOG_DIR}/" ./
# 删除临时文件、文件夹
rm -f "${GIT_PULL_LOG_FILE_LIST}"
rm -r "${GIT_PULL_LOG_DIR}"

2、执行验证脚本

脚本的共1个参数,为要解析的根目录。

sh /opt/git-repo-sync-script.sh /opt/GitRepoClone/

每次脚本执行完成后,会在 指定的 根搜索目录 下生成3个日志文件:

  • 本地仓库目录:gitRepoLocalList-*.txt
  • 远程仓库列表:gitRepoRemoteList-*.txt
  • 同步日志明细:gitRepoPullLog-*.txt

Linux系统,可以配合 crontab 定时任务使用。

3、查看日志输出

  • 3.1、本地仓库目录

  • 3.2、远程仓库列表

迁移、分享时,可以通过 远程仓库列表文件 快速查找。

  • 3.3、同步日志列表

详细记录每个仓库远程地址、本地目录、变更内容。

建议:

由于是通过shell脚本批量更新,速度很快,可以在每个仓库同步成功后,设置一个暂停时间(如:1秒~5秒),避免被 github 墙。

        以上脚本还有优化的地方(如:部分仓库可能突然被设置需要登录github、gitee后才能同步,此时需要人工干预),请根据实际需求调整修改。

        欢迎留言、交流……


附录:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂龙骄子

独码乐,不如众码乐,乐享其中

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值