本地有100多个git仓库,手工同步更新是一件麻烦而痛苦的事情!经过分析,可使用git脚本+定时任务,实现自动同步。解放自己,做更有意义的事情。
目录
运行环境:
- 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后才能同步,此时需要人工干预),请根据实际需求调整修改。
欢迎留言、交流……
附录:


898

被折叠的 条评论
为什么被折叠?



