如何更新带有LFS的只读Git镜像仓库?
问题描述
- 需求:因网络速度慢,要在本地网络创建Git仓库的只读镜像,计划通过crontab在上班前更新,确保工作日开始时本地镜像拥有最新内容(包含LFS对象)
- 环境:Ubuntu 22.04服务器
git.localnetwork,镜像存储目录为/var/www/html/git-mirror/<mirrored git sites>,示例路径:/var/www/html/git-mirror/source.codeaurora.org/external/imx/linux-imx.git - 已完成的镜像创建步骤(以示例仓库为例):
me@git:/var/www/html/git-mirror$ mkdir -p source.codeaurora.org/external/imx me@git:<path>$ cd source.codeaurora.org/external/imx me@git:<path>$ git clone --mirror git git://source.codeaurora.org/external/imx/linux-imx.git me@git:<path>$ cd linux-imx.git me@git:<local_mirror_repo_dir>$ git lfs fetch --all
- 疑问:以下命令中哪种适合更新只读镜像,确保与远程仓库完全一致(包含LFS对象)?
me@git:<local_mirror_repo_dir>$ git pull me@git:<local_mirror_repo_dir>$ git fetch me@git:<local_mirror_repo_dir>$ git fetch --prune me@git:<local_mirror_repo_dir>$ git remote update me@git:<local_mirror_repo_dir>$ git remote update --prune
最优更新方案
针对只读镜像的更新需求,结合Git镜像仓库特性和LFS对象同步,推荐使用以下组合命令:
单个镜像仓库更新命令
Git仓库同步:执行
git fetch --prunegit fetch:拉取远程仓库所有新分支、标签和提交历史,不会修改本地任何分支(完全适配只读镜像的无工作区特性)--prune:删除本地已在远程不存在的分支、标签和引用,确保本地镜像与远程完全对齐,不会残留过时内容- 排除其他命令的原因:
git pull本质是fetch+merge,但镜像仓库无工作区和本地分支,执行会报错;git remote update系列命令虽能同步,但git fetch --prune针对单仓库操作更直接高效
LFS对象同步:执行
git lfs fetch --all- 单独的
git fetch不会同步LFS对象,必须通过此命令拉取远程所有新增的LFS对象,保证镜像包含完整的LFS内容
- 单独的
完整的单仓库更新命令序列:
cd /var/www/html/git-mirror/source.codeaurora.org/external/imx/linux-imx.git git fetch --prune git lfs fetch --all
批量更新所有镜像仓库脚本
如果需要一次性更新所有镜像,可以写个Shell脚本遍历所有.git目录:
#!/bin/bash MIRROR_ROOT="/var/www/html/git-mirror" # 遍历所有.git目录并执行更新 find "$MIRROR_ROOT" -name "*.git" -type d | while read -r repo_dir; do echo "正在更新镜像: $repo_dir" cd "$repo_dir" || continue git fetch --prune git lfs fetch --all done
将脚本保存为update-git-mirrors.sh,赋予执行权限chmod +x update-git-mirrors.sh,然后添加到crontab即可(比如设置为工作日早上7点执行)。
内容的提问来源于stack exchange,提问作者Kalle
相关产品推荐
相关产品推荐

