Git镜像同步时忽略/截断大文件的远程推送方案咨询
解决方案:用Git自定义过滤器实现大文件自动截断同步
针对你的需求,推荐使用Git smudge/clean过滤器在本地仓库自动将指定大文件替换为0字节,既保留完整提交历史(仅修改大文件内容),又能避开hostB的大小限制拦截,且无需每次重新克隆仓库。
操作步骤(仅首次配置需执行,后续同步复用仓库)
1. 初始化本地仓库并配置过滤器
- 克隆hostA的仓库并添加hostB远程:
git clone hostA:repo1.git cd repo1 git remote add hostB hostB:repo1.git - 在本地仓库创建处理脚本
truncate-large-files.sh,用于将指定大文件转为0字节:#!/bin/sh # 替换为实际需要处理的大文件路径,多个文件用空格分隔 LARGE_FILES="path/to/large1.bin path/to/large2.zip" for file in $LARGE_FILES; do if [ -f "$file" ]; then truncate -s 0 "$file" fi done - 赋予脚本执行权限:
chmod +x truncate-large-files.sh - 在仓库的
.git/config中添加自定义过滤器配置:[filter "truncate-large"] clean = ./truncate-large-files.sh smudge = cat - 创建/修改
.gitattributes文件,指定需要应用过滤器的文件:path/to/large1.bin filter=truncate-large path/to/large2.zip filter=truncate-large
2. 首次同步到hostB
- 拉取hostA的main分支和所有标签:
git pull hostA main --tags - 过滤器会自动将指定大文件转为0字节,强制推送到hostB(因历史内容被修改,需强制推送):
git push hostB main --force git push hostB --tags
3. 每月同步流程
- 拉取hostA的最新更新:
git pull hostA main --tags - 过滤器自动处理新提交中的大文件,直接强制推送更新到hostB:
git push hostB main --force git push hostB --tags
方案优势
- 无需每次重新克隆仓库,本地仓库可长期复用
- 拉取hostA更新时,大文件始终保持0字节与本地一致,不会产生冲突
- 完整保留提交历史结构(仅修改大文件内容),标签同步不受影响
备选方案:单次历史重写(适合极低更新频率场景)
如果不想维护过滤器配置,可在每次同步时基于hostA最新代码做单次历史重写,仅修改大文件内容而非移除:
# 克隆或拉取hostA最新代码 git clone hostA:repo1.git cd repo1 git remote add hostB hostB:repo1.git # 重写历史,将指定大文件替换为0字节 git filter-branch --tree-filter 'truncate -s 0 path/to/large1.bin path/to/large2.zip' -- main # 强制推送和标签同步 git push hostB main --force git push hostB --tags
内容的提问来源于stack exchange,提问作者Ludo
相关产品推荐
相关产品推荐

